--- /dev/null
+/* Copyright (c) 1998,2011-2012,2014 Apple Inc. All Rights Reserved.
+ *
+ * NOTICE: USE OF THE MATERIALS ACCOMPANYING THIS NOTICE IS SUBJECT
+ * TO THE TERMS OF THE SIGNED "FAST ELLIPTIC ENCRYPTION (FEE) REFERENCE
+ * SOURCE CODE EVALUATION AGREEMENT" BETWEEN APPLE, INC. AND THE
+ * ORIGINAL LICENSEE THAT OBTAINED THESE MATERIALS FROM APPLE,
+ * INC. ANY USE OF THESE MATERIALS NOT PERMITTED BY SUCH AGREEMENT WILL
+ * EXPOSE YOU TO LIABILITY.
+ ***************************************************************************
+ *
+ * curveParams.h - FEE curve parameter functions
+ *
+ * Revision History
+ * ----------------
+ * 9 Sep 98 at NeXT
+ * Added y1Plus for IEEE P1363 compliance.
+ * 20 Jan 98 at Apple
+ * Added primeType, m, basePrimeRecip.
+ * 11 Jun 97 at Apple
+ * Added x1OrderPlusRecip and lesserX1OrderRecip
+ * Disabled CP_SET_GIANT_SIZE hack
+ * 9 Jan 1997 at NeXT
+ * Major mods for IEEE-style parameters.
+ * 7 Aug 1996 at NeXT
+ * Created.
+ */
+
+#ifndef _CK_CURVEPARAMS_H_
+#define _CK_CURVEPARAMS_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "giantIntegers.h"
+#include "feeTypes.h"
+
+/*
+ * Parameters defining a specific elliptic curve (and its initial points).
+ */
+typedef struct {
+
+ /*
+ * Basic characteristic of prime field (PT_FEE, etc.)
+ */
+ feePrimeType primeType;
+
+ /*
+ * Basic curve type (CT_MONTGOMERY, etc.)
+ * Note that FCT_ANSI is stored here as FCT_Weierstrass.
+ */
+ feeCurveType curveType;
+
+ /*
+ * Parameters defining the base prime (2^q - k) for
+ * FPT_FEE and FPT_Mersenne. For FPT_General, q is the
+ * prime size in bits and k is 0.
+ */
+ unsigned q;
+ int k;
+
+ /*
+ * For all primeTypes, the field is defined as F(basePrime**m).
+ * This library can only deal with m == 1 for now.
+ */
+ unsigned m;
+
+ /*
+ * coefficients in the following equation:
+ * y^2 = x^3 + (c * x^2) + (a * x) + b
+ */
+ giant a;
+ giant b;
+ giant c;
+
+ /*
+ * Initial public point x-coordinates.
+ * x1Minus not used for ECDSA; X9.62 curves don't have this field.
+ */
+ giant x1Plus;
+ giant x1Minus;
+
+ /*
+ * Y coordinate of normalized projective initial public
+ * point for plus curve. I.e., Initial point = {x1Plus, p1Plus, 1}.
+ * Only valid for curveType == CT_WEIERSTRASS. This is calculated
+ * when a new curveParams is created.
+ */
+ giant y1Plus;
+
+ /*
+ * Curve orders. These are prime, or have large prime factors.
+ * cOrderMinus not used for ECDSA; X9.62 curves don't have this field.
+ */
+ giant cOrderPlus;
+ giant cOrderMinus;
+
+ /*
+ * Point orders (the large prime factors of the respective
+ * curve orders).
+ * x1OrderMinus not used for ECDSA; X9.62 curves don't have this field.
+ */
+ giant x1OrderPlus;
+ giant x1OrderMinus;
+
+ /*
+ * The base prime. For PT_GENERAL, this is a basic defining
+ * characteristic of a curve; otherwise, it is derived as 2**q - k.
+ */
+ giant basePrime;
+
+ /*
+ * The remaining fields are calculated and stored here as an
+ * optimization.
+ */
+
+ /*
+ * The minimum size of a giant, in bytes, to represent any point
+ * on this curve. This is generally used only when serializing
+ * giants of a known size.
+ */
+ unsigned minBytes;
+
+ /*
+ * The maximum size of a giant, in giantDigits, to be used with all
+ * FEE arithmetic for this curve. This is generally used to alloc
+ * giants.
+ */
+ unsigned maxDigits;
+
+ /*
+ * Reciprocals of lesserX1Order() and x1OrderPlus. Calculated
+ * lazily by clients in the case of creation of a curveParams
+ * struct from a byteRep representation.
+ */
+ giant x1OrderPlusRecip;
+ giant lesserX1OrderRecip;
+
+ /*
+ * Reciprocal of basePrime. Only used for PT_GENERAL.
+ */
+ giant basePrimeRecip;
+} curveParams;
+
+#if 0
+/*
+ * Values for primeType.
+ */
+#define PT_MERSENNE 0 /* basePrime = 2**q - 1 */
+#define PT_FEE 1 /* basePrime = 2**q - k, k is "small" */
+#define PT_GENERAL 2 /* other prime modulus */
+
+/*
+ * Values for curveType. Note that Atkin3 (a=0) and Atkin4 (b=0) are
+ * subsets of CT_WEIERSTRASS.
+ */
+#define CT_MONTGOMERY 0 /* a=1, b=0 */
+#define CT_WEIERSTRASS 1 /* c=0 */
+#define CT_GENERAL 4 /* other */
+#endif /* 0 */
+
+/*
+ * Obtain a malloc'd curveParams for a specified feeDepth.
+ */
+curveParams *curveParamsForDepth(feeDepth depth);
+
+/*
+ * Obtain a malloc'd and uninitialized curveParams, to be init'd by caller
+ * (when matching existing curve params).
+ */
+curveParams *newCurveParams(void);
+
+/*
+ * Alloc and zero reciprocal giants, when maxDigits is known.
+ */
+void allocRecipGiants(curveParams *cp);
+
+/*
+ * Alloc a new curveParams struct as a copy of specified instance.
+ */
+curveParams *curveParamsCopy(curveParams *cp);
+
+/*
+ * Free a curveParams struct.
+ */
+void freeCurveParams(curveParams *cp);
+
+/*
+ * Returns 1 if two sets of curve parameters are equivalent, else returns 0.
+ */
+int curveParamsEquivalent(curveParams *cp1, curveParams *cp2);
+
+/*
+ * Obtain the lesser of {x1OrderPlus, x1OrderMinus}. Returned value is not
+ * malloc'd; it's a pointer to one of the orders in *cp.
+ */
+giant lesserX1Order(curveParams *cp);
+
+/*
+ * Prime the curveParams and giants modules for quick allocs of giants.
+ */
+void curveParamsInitGiants(void);
+
+/*
+ * Infer run-time calculated fields from a partially constructed curveParams.
+ */
+void curveParamsInferFields(curveParams *cp);
+
+/*
+ * Given key size in bits, obtain the asssociated depth.
+ * Returns FR_IllegalDepth if specify key size not found
+ * in current curve tables.
+ */
+feeReturn feeKeyBitsToDepth(unsigned keyBits,
+ feePrimeType primeType, /* FPT_Fefault means "best one" */
+ feeCurveType curveType, /* FCT_Default means "best one" */
+ feeDepth *depth);
+
+/*
+ * Obtain depth for specified curveParams
+ */
+feeReturn curveParamsDepth(
+ curveParams *cp,
+ feeDepth *depth);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _CK_CURVEPARAMS_H_ */