TrustCore SDK NanoCrypto API reference  version 7.0
primeec.h
Go to the documentation of this file.
1 /*
2  * primeec.h
3  *
4  * Finite Field Elliptic Curve Header
5  *
6  * Copyright 2019-2024 DigiCert, Inc. All Rights Reserved.
7  * Proprietary and Confidential Material.
8  *
9  */
10 
25 /*------------------------------------------------------------------*/
26 
27 #ifndef __PRIMEEC_HEADER__
28 #define __PRIMEEC_HEADER__
29 
30 #include "../cap/capdecl.h"
31 #include "../crypto/cryptodecl.h"
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 /* Support for Finite Field Elliptic Curve Operations */
38 
39 /* Default flag passed into ECDH generate shared secret. This will return the X
40  * value back to the caller.
41  */
42 #define ECDH_X_CORD_ONLY 1
43 
44 /* Pass this into ECDH generate shared secret to get the X and Y back.
45  */
46 #define ECDH_XY_CORD 0
47 
48 typedef struct ECCKey
49 {
50  intBoolean privateKey;
51  PFEPtr Qx; /* public */
52  PFEPtr Qy; /* public */
53  PFEPtr k; /* private*/
54  PEllipticCurvePtr pCurve; /* curve */
55  MocAsymKey pPrivateKey;
56  MocAsymKey pPublicKey;
57  ubyte4 curveIndex;
58  ubyte4 enabled;
59  ubyte4 curveId;
60  void *pEdECCKey;
61 
62 } ECCKey;
63 
64 /* Forward declaration */
65 typedef struct MEccKeyTemplate *MEccKeyTemplatePtr;
66 
67 #if (defined(__ENABLE_MOCANA_ECC__))
68 
69 #ifdef MOC_EXTERN_PRIMEEC_H
70 #undef MOC_EXTERN_PRIMEEC_H
71 #endif /* MOC_EXTERN_PRIMEEC_H */
72 
73 /* For non OpenSSL builds macro the old API into the new API for backwards
74  * compatability. OpenSSL builds cannot define this macro as there are namespace
75  * issues with the old APIs. */
76 #ifndef OPENSSL_ENGINE
77 #ifndef ECDSA_sign
78 #define ECDSA_sign ECDSA_signDigestAux
79 #endif /* ECDSA_sign */
80 #endif /* OPENSSL_ENGINE */
81 
82 #ifdef __RTOS_WIN32__
83 
84 #ifdef WIN_EXPORT_PRIMEEC_H
85 #define MOC_EXTERN_PRIMEEC_H __declspec(dllexport)
86 #else
87 #define MOC_EXTERN_PRIMEEC_H __declspec(dllimport) extern
88 #endif /* WIN_EXPORT_PRIMEEC_H */
89 
90 #ifdef WIN_STATIC
91 #undef MOC_EXTERN_PRIMEEC_H
92 #define MOC_EXTERN_PRIMEEC_H extern
93 #endif /* WIN_STATIC */
94 
95 #else
96 
97 #define MOC_EXTERN_PRIMEEC_H MOC_EXTERN
98 
99 #endif /* RTOS_WIN32 */
100 
101 #ifdef MOC_EXTERN_P
102 #undef MOC_EXTERN_P
103 #endif /* MOC_EXTERN_P */
104 
105 #define MOC_EXTERN_P MOC_EXTERN_PRIMEEC_H
106 
107 /* NIST curves */
108 #ifndef __ENABLE_MOCANA_ECC_P192__
109 #define NUM_EC_P192 (0)
110 #else
111 #define NUM_EC_P192 (1)
112 MOC_EXTERN_PRIMEEC_H const PEllipticCurvePtr EC_P192;
113 #endif
114 
115 #ifdef __DISABLE_MOCANA_ECC_P224__
116 #define NUM_EC_P224 (0)
117 #else
118 #define NUM_EC_P224 (1)
119 MOC_EXTERN_PRIMEEC_H const PEllipticCurvePtr EC_P224;
120 #endif
121 
122 #ifdef __DISABLE_MOCANA_ECC_P256__
123 #define NUM_EC_P256 (0)
124 #else
125 #define NUM_EC_P256 (1)
126 MOC_EXTERN_PRIMEEC_H const PEllipticCurvePtr EC_P256;
127 #endif
128 
129 #ifdef __DISABLE_MOCANA_ECC_P384__
130 #define NUM_EC_P384 (0)
131 #else
132 #define NUM_EC_P384 (1)
133 MOC_EXTERN_PRIMEEC_H const PEllipticCurvePtr EC_P384;
134 #endif
135 
136 #ifdef __DISABLE_MOCANA_ECC_P521__
137 #define NUM_EC_P521 (0)
138 #else
139 #define NUM_EC_P521 (1)
140 MOC_EXTERN_PRIMEEC_H const PEllipticCurvePtr EC_P521;
141 #endif
142 
143 #define NUM_ECC_PCURVES ((NUM_EC_P192) + (NUM_EC_P224) + (NUM_EC_P256) + \
144  (NUM_EC_P384) + (NUM_EC_P521))
145 
146 
156 MOC_EXTERN PrimeFieldPtr EC_getUnderlyingField(PEllipticCurvePtr pEC);
157 
175 MOC_EXTERN MSTATUS EC_multiplyPoint(PrimeFieldPtr pPF, PFEPtr pResX, PFEPtr pResY,
176  ConstPFEPtr k, ConstPFEPtr pX, ConstPFEPtr pY);
177 
198 MOC_EXTERN MSTATUS EC_addMultiplyPoint(PrimeFieldPtr pPF, PFEPtr pResX, PFEPtr pResY,
199  ConstPFEPtr pAddedX, ConstPFEPtr pAddedY,
200  ConstPFEPtr k, ConstPFEPtr pX, ConstPFEPtr pY);
201 
216 MOC_EXTERN MSTATUS EC_computeYFromX( PEllipticCurvePtr pEC, ConstPFEPtr x, PFEPtr y);
217 
237 MOC_EXTERN MSTATUS EC_newKey(PEllipticCurvePtr pEC, ECCKey** ppNewKey);
238 
249 MOC_EXTERN MSTATUS EC_deleteKey(ECCKey** ppKey);
250 
263 MOC_EXTERN MSTATUS EC_cloneKey(ECCKey** ppNew, const ECCKey* pSrc);
264 
279 MOC_EXTERN MSTATUS EC_equalKey(const ECCKey* pKey1, const ECCKey* pKey2, byteBoolean* res);
280 
303 MOC_EXTERN MSTATUS EC_setKeyParameters(ECCKey* pKey, const ubyte* point, ubyte4 pointLen,
304  const ubyte* scalar, ubyte4 scalarLen);
305 
319 MOC_EXTERN MSTATUS EC_setPrivateKey( ECCKey *pKey, ubyte *pScalar, ubyte4 scalarLen);
320 
331 MOC_EXTERN intBoolean EC_compareEllipticCurves(PEllipticCurvePtr pEC1,
332  PEllipticCurvePtr pEC2);
333 
348 MOC_EXTERN MSTATUS EC_verifyKeyPair(PEllipticCurvePtr pEC, ConstPFEPtr k,
349  ConstPFEPtr pQx, ConstPFEPtr pQy);
350 
374 MOC_EXTERN MSTATUS EC_generateKeyPair(PEllipticCurvePtr pEC, RNGFun rngFun, void* rngArg,
375  PFEPtr k, PFEPtr pQx, PFEPtr pQy);
376 
391 MOC_EXTERN MSTATUS EC_verifyPublicKey(PEllipticCurvePtr pEC, ConstPFEPtr pQx, ConstPFEPtr pQy);
392 
408 MOC_EXTERN MSTATUS EC_verifyPoint(PEllipticCurvePtr pEC, ConstPFEPtr pQx, ConstPFEPtr pQy);
409 
429 MOC_EXTERN MSTATUS EC_pointToByteString(PEllipticCurvePtr pEC,
430  ConstPFEPtr pX, ConstPFEPtr pY,
431  ubyte** s, sbyte4* pLen);
432 
450 MOC_EXTERN MSTATUS EC_setPointToByteString(PEllipticCurvePtr pEC,
451  const ubyte* s, sbyte4 len,
452  PFEPtr pX, PFEPtr pY);
453 
468 MOC_EXTERN MSTATUS EC_getPointByteStringLen(PEllipticCurvePtr pEC, sbyte4 *pLen);
469 
487 MOC_EXTERN MSTATUS EC_writePointToBuffer(PEllipticCurvePtr pEC,
488  ConstPFEPtr pX, ConstPFEPtr pY,
489  ubyte* s, sbyte4 len);
490 
512 MOC_EXTERN MSTATUS EC_byteStringToPoint(PEllipticCurvePtr pEC,
513  const ubyte* s, sbyte4 len,
514  PFEPtr* ppX, PFEPtr* ppY);
515 
534 MOC_EXTERN MSTATUS ECDSA_signDigestAux(PEllipticCurvePtr pEC, ConstPFEPtr d,
535  RNGFun rngFun, void* rngArg,
536  const ubyte* hash, ubyte4 hashLen,
537  PFEPtr r, PFEPtr s);
538 
555 MOC_EXTERN MSTATUS ECDSA_verifySignature(PEllipticCurvePtr pEC,
556  ConstPFEPtr pPublicKeyX, ConstPFEPtr pPublicKeyY,
557  const ubyte* hash, ubyte4 hashLen,
558  ConstPFEPtr r, ConstPFEPtr s);
559 
581 MOC_EXTERN MSTATUS ECDH_generateSharedSecretAux(PEllipticCurvePtr pEC,
582  ConstPFEPtr pX, ConstPFEPtr pY,
583  ConstPFEPtr scalarMultiplier,
584  ubyte** sharedSecret,
585  sbyte4* sharedSecretLen,
586  sbyte4 flag);
587 
609 MOC_EXTERN MSTATUS ECDH_generateSharedSecret(PEllipticCurvePtr pEC,
610  const ubyte* pointByteString,
611  sbyte4 pointByteStringLen,
612  ConstPFEPtr scalarMultiplier,
613  ubyte** sharedSecret,
614  sbyte4* sharedSecretLen);
615 
616 
617 /* mode macros for DH Key Agreement Schemes */
618 #define FULL_UNIFIED 0
619 #define FULL_MQV 1
620 #define EPHEMERAL_UNIFIED 2
621 #define ONE_PASS_UNIFIED_U 3
622 #define ONE_PASS_UNIFIED_V 4
623 #define ONE_PASS_MQV_U 5
624 #define ONE_PASS_MQV_V 6
625 #define ONE_PASS_DH_U 7
626 #define ONE_PASS_DH_V 8
627 #define STATIC_UNIFIED 9
628 
663 MOC_EXTERN MSTATUS ECDH_keyAgreementSchemePrimeCurve(
664  ubyte4 mode,
665  ECCKey *pStatic,
666  ECCKey *pEphemeral,
667  ubyte *pOtherPartysStatic,
668  ubyte4 otherStaticLen,
669  ubyte *pOtherPartysEphemeral,
670  ubyte4 otherEphemeralLen,
671  ubyte **ppSharedSecret,
672  ubyte4 *pSharedSecretLen);
673 
674 #if defined(__ENABLE_MOCANA_ECC_COMB__) || !defined( __ENABLE_MOCANA_SMALL_CODE_FOOTPRINT__)
675 
693 MOC_EXTERN MSTATUS EC_combSize( PrimeFieldPtr pPF, sbyte4 windowSize, sbyte4* size);
694 
717 MOC_EXTERN MSTATUS EC_precomputeComb(PrimeFieldPtr pPF, ConstPFEPtr pQx,
718  ConstPFEPtr pQy, sbyte4 windowSize,
719  PFEPtr* pPrecomputed);
720 
741 MOC_EXTERN MSTATUS EC_precomputeCombOfCurve(PEllipticCurvePtr pEC, sbyte4 windowSize,
742  PFEPtr* pCurvePrecomputed);
743 
761 MOC_EXTERN MSTATUS EC_deleteComb(PrimeFieldPtr pPF, sbyte4 windowSize, PFEPtr *pComb);
762 
763 #endif /* __ENABLE_MOCANA_ECC_COMB__ !__ENABLE_MOCANA_SMALL_CODE_FOOTPRINT__ */
764 
765 #if !defined(__DISABLE_MOCANA_SIGNED_ODD_COMB__) && defined(__ENABLE_MOCANA_SIGNED_ODD_COMB_PERSIST__)
766 
779 MOC_EXTERN MSTATUS EC_deletePrimeCurveCombsAndMutexes(void);
780 
796 MOC_EXTERN MSTATUS EC_createPrimeCurveMutexes(void);
797 #endif
798 
821 MOC_EXTERN MSTATUS ECDSA_verifySignatureEx(PEllipticCurvePtr pEC,
822  ConstPFEPtr pPublicKeyX, ConstPFEPtr pPublicKeyY,
823  const ubyte* hash, ubyte4 hashLen,
824  sbyte4 curveWinSize, ConstPFEPtr pCurvePrecomp,
825  sbyte4 pubKeyWinSize, ConstPFEPtr pPubKeyPrecomp,
826  ConstPFEPtr r, ConstPFEPtr s);
827 
828 #endif /* __ENABLE_MOCANA_ECC__ */
829 
830 #ifdef __cplusplus
831 }
832 #endif
833 
834 #endif /* __PRIMEEC_HEADER__ */
835 
MOC_EXTERN MSTATUS ECDH_generateSharedSecret(PEllipticCurvePtr pEC, const ubyte *pointByteString, sbyte4 pointByteStringLen, ConstPFEPtr scalarMultiplier, ubyte **sharedSecret, sbyte4 *sharedSecretLen)
Generates a Diffie-Hellman shared secret from an uncompressed form public key.
MOC_EXTERN MSTATUS EC_getPointByteStringLen(PEllipticCurvePtr pEC, sbyte4 *pLen)
Gets the length in bytes of an arbitrary point's uncompressed form.
MOC_EXTERN MSTATUS EC_generateKeyPair(PEllipticCurvePtr pEC, RNGFun rngFun, void *rngArg, PFEPtr k, PFEPtr pQx, PFEPtr pQy)
Generates a new ECC private/public key pair.
MOC_EXTERN MSTATUS EC_verifyPublicKey(PEllipticCurvePtr pEC, ConstPFEPtr pQx, ConstPFEPtr pQy)
Verifies that a public key point is a valid point on the curve.
MOC_EXTERN intBoolean EC_compareEllipticCurves(PEllipticCurvePtr pEC1, PEllipticCurvePtr pEC2)
Compares if two elliptic curve pointers are the same curve.
MOC_EXTERN MSTATUS EC_computeYFromX(PEllipticCurvePtr pEC, ConstPFEPtr x, PFEPtr y)
Computes a Y coordinate of a point on the curve from an X coordinate.
MOC_EXTERN MSTATUS EC_writePointToBuffer(PEllipticCurvePtr pEC, ConstPFEPtr pX, ConstPFEPtr pY, ubyte *s, sbyte4 len)
Converts a point on the curve to an uncompressed form byte array.
MOC_EXTERN MSTATUS EC_equalKey(const ECCKey *pKey1, const ECCKey *pKey2, byteBoolean *res)
Tests whether two ECCKeys have identical public keys.
MOC_EXTERN MSTATUS EC_setPrivateKey(ECCKey *pKey, ubyte *pScalar, ubyte4 scalarLen)
Sets the private key parameter of an ECCKey.
MOC_EXTERN PrimeFieldPtr EC_getUnderlyingField(PEllipticCurvePtr pEC)
Gets the underlying prime field associated with a prime curve.
MOC_EXTERN MSTATUS EC_pointToByteString(PEllipticCurvePtr pEC, ConstPFEPtr pX, ConstPFEPtr pY, ubyte **s, sbyte4 *pLen)
Converts a point on the curve to an uncompressed form byte array.
MOC_EXTERN MSTATUS EC_setKeyParameters(ECCKey *pKey, const ubyte *point, ubyte4 pointLen, const ubyte *scalar, ubyte4 scalarLen)
Sets the key parameters of an ECCKey.
MOC_EXTERN MSTATUS EC_verifyPoint(PEllipticCurvePtr pEC, ConstPFEPtr pQx, ConstPFEPtr pQy)
Verifies that a point is a valid point on the curve.
MOC_EXTERN MSTATUS ECDH_keyAgreementSchemePrimeCurve(ubyte4 mode, ECCKey *pStatic, ECCKey *pEphemeral, ubyte *pOtherPartysStatic, ubyte4 otherStaticLen, ubyte *pOtherPartysEphemeral, ubyte4 otherEphemeralLen, ubyte **ppSharedSecret, ubyte4 *pSharedSecretLen)
Generates a Diffie-Hellman shared secret via one of the major modes.
MOC_EXTERN MSTATUS EC_deleteKey(ECCKey **ppKey)
Deletes an ECCKey instance.
MOC_EXTERN MSTATUS EC_cloneKey(ECCKey **ppNew, const ECCKey *pSrc)
Clones an ECCKey instance.
MOC_EXTERN MSTATUS EC_newKey(PEllipticCurvePtr pEC, ECCKey **ppNewKey)
Allocates a new ECCKey instance.
MOC_EXTERN MSTATUS EC_addMultiplyPoint(PrimeFieldPtr pPF, PFEPtr pResX, PFEPtr pResY, ConstPFEPtr pAddedX, ConstPFEPtr pAddedY, ConstPFEPtr k, ConstPFEPtr pX, ConstPFEPtr pY)
Computes a scalar-point multiplication plus an addition on a prime curve.
MOC_EXTERN MSTATUS EC_precomputeComb(PrimeFieldPtr pPF, ConstPFEPtr pQx, ConstPFEPtr pQy, sbyte4 windowSize, PFEPtr *pPrecomputed)
Computes the comb of a point on the curve.
MOC_EXTERN MSTATUS EC_multiplyPoint(PrimeFieldPtr pPF, PFEPtr pResX, PFEPtr pResY, ConstPFEPtr k, ConstPFEPtr pX, ConstPFEPtr pY)
Computes a scalar-point multiplication on a prime curve.
MOC_EXTERN MSTATUS ECDH_generateSharedSecretAux(PEllipticCurvePtr pEC, ConstPFEPtr pX, ConstPFEPtr pY, ConstPFEPtr scalarMultiplier, ubyte **sharedSecret, sbyte4 *sharedSecretLen, sbyte4 flag)
Generates a Diffie-Hellman shared secret.
MOC_EXTERN MSTATUS EC_combSize(PrimeFieldPtr pPF, sbyte4 windowSize, sbyte4 *size)
Computes the total number of pf_units that will be needed to store a comb.
MOC_EXTERN MSTATUS EC_setPointToByteString(PEllipticCurvePtr pEC, const ubyte *s, sbyte4 len, PFEPtr pX, PFEPtr pY)
Converts an uncompressed form point to prime field elements.
MOC_EXTERN MSTATUS EC_byteStringToPoint(PEllipticCurvePtr pEC, const ubyte *s, sbyte4 len, PFEPtr *ppX, PFEPtr *ppY)
Converts an uncompressed form point to newly allocated prime field elements.
MOC_EXTERN MSTATUS EC_verifyKeyPair(PEllipticCurvePtr pEC, ConstPFEPtr k, ConstPFEPtr pQx, ConstPFEPtr pQy)
Verifies that a given private key is associated with a given public key.
MOC_EXTERN MSTATUS ECDSA_signDigestAux(PEllipticCurvePtr pEC, ConstPFEPtr d, RNGFun rngFun, void *rngArg, const ubyte *hash, ubyte4 hashLen, PFEPtr r, PFEPtr s)
Signs a message digest via the ECDSA signature algorithm.
sbyte4(* RNGFun)(void *rngFunArg, ubyte4 length, ubyte *buffer)
Function pointer type for a method that produces (pseudo) random bytes.
Definition: random.h:98
MOC_EXTERN MSTATUS ECDSA_verifySignatureEx(PEllipticCurvePtr pEC, ConstPFEPtr pPublicKeyX, ConstPFEPtr pPublicKeyY, const ubyte *hash, ubyte4 hashLen, sbyte4 curveWinSize, ConstPFEPtr pCurvePrecomp, sbyte4 pubKeyWinSize, ConstPFEPtr pPubKeyPrecomp, ConstPFEPtr r, ConstPFEPtr s)
Verifies a message digest via the ECDSA signature algorithm using provided combs. ...
MOC_EXTERN MSTATUS EC_deleteComb(PrimeFieldPtr pPF, sbyte4 windowSize, PFEPtr *pComb)
Zeros and frees a comb.
MOC_EXTERN MSTATUS EC_deletePrimeCurveCombsAndMutexes(void)
Zeros and frees globally stored combs and mutexes.
MOC_EXTERN MSTATUS EC_precomputeCombOfCurve(PEllipticCurvePtr pEC, sbyte4 windowSize, PFEPtr *pCurvePrecomputed)
Computes the comb of the curve's large cyclic group generator.
MOC_EXTERN MSTATUS ECDSA_verifySignature(PEllipticCurvePtr pEC, ConstPFEPtr pPublicKeyX, ConstPFEPtr pPublicKeyY, const ubyte *hash, ubyte4 hashLen, ConstPFEPtr r, ConstPFEPtr s)
Verifies a message digest via the ECDSA signature algorithm.
MOC_EXTERN MSTATUS EC_createPrimeCurveMutexes(void)
Creates globally stored mutexes used for thread safety.