TrustCore SDK NanoCrypto API reference  version 7.0
primefld.h
Go to the documentation of this file.
1 /*
2  * primefld.h
3  *
4  * Prime Field Header
5  *
6  * Copyright 2019-2024 DigiCert, Inc. All Rights Reserved.
7  * Proprietary and Confidential Material.
8  *
9  */
10 
25 /*------------------------------------------------------------------*/
26 
27 #ifndef __PRIMEFLD_HEADER__
28 #define __PRIMEFLD_HEADER__
29 
30 #include "../crypto/cryptodecl.h"
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 #if (defined(__ENABLE_MOCANA_ECC__))
37 
38 #ifdef __ENABLE_MOCANA_64_BIT__
39 #define MOC_EC_ONE 0x01ULL
40 #define MOC_EC_TWO 0x02ULL
41 #else
42 #define MOC_EC_ONE 0x01
43 #define MOC_EC_TWO 0x02
44 #endif
45 
46 #ifdef MOC_EXTERN_PRIMEFLD_H
47 #undef MOC_EXTERN_PRIMEFLD_H
48 #endif /* MOC_EXTERN_PRIMEFLD_H */
49 
50 #ifdef __RTOS_WIN32__
51 
52 #ifdef WIN_EXPORT_PRIMEFLD_H
53 #define MOC_EXTERN_PRIMEFLD_H __declspec(dllexport)
54 #else
55 #define MOC_EXTERN_PRIMEFLD_H __declspec(dllimport) extern
56 #endif /* WIN_EXPORT_PRIMEFLD_H */
57 
58 #ifdef WIN_STATIC
59 #undef MOC_EXTERN_PRIMEFLD_H
60 #define MOC_EXTERN_PRIMEFLD_H extern
61 #endif /* WIN_STATIC */
62 
63 #else
64 
65 #define MOC_EXTERN_PRIMEFLD_H MOC_EXTERN
66 
67 #endif /* RTOS_WIN32 */
68 
69 #ifdef MOC_EXTERN_P
70 #undef MOC_EXTERN_P
71 #endif /* MOC_EXTERN_P */
72 
73 #define MOC_EXTERN_P MOC_EXTERN_PRIMEFLD_H
74 
75 /* NIST curves */
76 #ifdef __ENABLE_MOCANA_ECC_P192__
77 MOC_EXTERN_PRIMEFLD_H const PrimeFieldPtr PF_p192;
78 #endif
79 
80 #ifndef __DISABLE_MOCANA_ECC_P224__
81 MOC_EXTERN_PRIMEFLD_H const PrimeFieldPtr PF_p224;
82 #endif
83 
84 #ifndef __DISABLE_MOCANA_ECC_P256__
85 MOC_EXTERN_PRIMEFLD_H const PrimeFieldPtr PF_p256;
86 #endif
87 
88 #ifndef __DISABLE_MOCANA_ECC_P384__
89 MOC_EXTERN_PRIMEFLD_H const PrimeFieldPtr PF_p384;
90 #endif
91 
92 #if defined(__ENABLE_MOCANA_ECC_EDDSA_448__) || defined(__ENABLE_MOCANA_ECC_EDDH_448__) || defined(__ENABLE_MOCANA_FIPS_MODULE__)
93 MOC_EXTERN_PRIMEFLD_H const PrimeFieldPtr PF_p448;
94 #endif
95 
96 #ifndef __DISABLE_MOCANA_ECC_P521__
97 MOC_EXTERN_PRIMEFLD_H const PrimeFieldPtr PF_p521;
98 #endif
99 
120 MOC_EXTERN MSTATUS PRIMEFIELD_newElement( PrimeFieldPtr pField, PFEPtr* ppNewElem);
121 
134 MOC_EXTERN MSTATUS PRIMEFIELD_copyElement( PrimeFieldPtr pField, PFEPtr pDestElem, ConstPFEPtr pSrcElem);
135 
136 MOC_EXTERN intBoolean PRIMEFIELD_comparePrimeFields(PrimeFieldPtr pField1, PrimeFieldPtr pField2);
137 
149 MOC_EXTERN MSTATUS PRIMEFIELD_deleteElement( PrimeFieldPtr pField, PFEPtr* ppDeleteElem);
150 
164 MOC_EXTERN MSTATUS PRIMEFIELD_add( PrimeFieldPtr pField, PFEPtr pSumAndValue, ConstPFEPtr pAddend);
165 
179 MOC_EXTERN MSTATUS PRIMEFIELD_subtract( PrimeFieldPtr pField, PFEPtr pResultAndValue, ConstPFEPtr pSubtract);
180 
193 MOC_EXTERN MSTATUS PRIMEFIELD_xor(PrimeFieldPtr pField, PFEPtr pResultAndValue, ConstPFEPtr pXor);
194 
208 MOC_EXTERN MSTATUS PRIMEFIELD_multiply( PrimeFieldPtr pField, PFEPtr pProduct, ConstPFEPtr pA, ConstPFEPtr pB);
209 
222 MOC_EXTERN MSTATUS PRIMEFIELD_shiftR( PrimeFieldPtr pField, PFEPtr pA);
223 
238 MOC_EXTERN MSTATUS PRIMEFIELD_getBit( PrimeFieldPtr pField, ConstPFEPtr pA, ubyte4 bitNum, ubyte* bit);
239 
253 MOC_EXTERN MSTATUS PRIMEFIELD_inverse( PrimeFieldPtr pField, PFEPtr pInverse, ConstPFEPtr pA);
254 
270 MOC_EXTERN MSTATUS PRIMEFIELD_divide( PrimeFieldPtr pField, PFEPtr pResult, ConstPFEPtr pA, ConstPFEPtr pDivisor);
271 
288 MOC_EXTERN MSTATUS PRIMEFIELD_squareRoot(PrimeFieldPtr pField, PFEPtr pResult, ConstPFEPtr pA);
289 
301 MOC_EXTERN sbyte4 PRIMEFIELD_cmpToUnsigned(PrimeFieldPtr pField, ConstPFEPtr pA, ubyte4 val);
302 
315 MOC_EXTERN MSTATUS PRIMEFIELD_setToUnsigned(PrimeFieldPtr pField, PFEPtr pA, ubyte4 val);
316 
331 MOC_EXTERN MSTATUS PRIMEFIELD_setToByteString( PrimeFieldPtr pField, PFEPtr pA, const ubyte* b, sbyte4 len);
332 
350 MOC_EXTERN MSTATUS PRIMEFIELD_getAsByteString( PrimeFieldPtr pField, ConstPFEPtr pA, ubyte** b, sbyte4* len);
351 
370 MOC_EXTERN MSTATUS PRIMEFIELD_getAsByteString2( PrimeFieldPtr pField, ConstPFEPtr pA, ConstPFEPtr pB, ubyte** b, sbyte4* len);
371 
387 MOC_EXTERN MSTATUS PRIMEFIELD_writeByteString( PrimeFieldPtr pField, ConstPFEPtr pA, ubyte* b, sbyte4 len);
388 
401 MOC_EXTERN MSTATUS PRIMEFIELD_getElementByteStringLen(PrimeFieldPtr pField, sbyte4* len);
402 
414 MOC_EXTERN sbyte4 PRIMEFIELD_cmp(PrimeFieldPtr pField, ConstPFEPtr pA, ConstPFEPtr pB);
415 
427 MOC_EXTERN intBoolean PRIMEFIELD_match(PrimeFieldPtr pField, ConstPFEPtr pA, ConstPFEPtr pB);
428 
450 MOC_EXTERN MSTATUS PRIMEFIELD_barrettMultiply( PrimeFieldPtr pField, PFEPtr pProduct, ConstPFEPtr pA,
451  ConstPFEPtr pB, ConstPFEPtr pModulo, ConstPFEPtr pMu);
452 
472 MOC_EXTERN MSTATUS PRIMEFIELD_addAux( PrimeFieldPtr pField, PFEPtr pSumAndValue, ConstPFEPtr pAddend,
473  ConstPFEPtr pModulus);
474 
495 MOC_EXTERN MSTATUS PRIMEFIELD_inverseAux( sbyte4 k, PFEPtr pInverse, ConstPFEPtr pA, ConstPFEPtr pModulus);
496 
517 MOC_EXTERN MSTATUS PRIMEFIELD_add2( PrimeFieldPtr pField, PFEPtr pSum, ConstPFEPtr pAddend, ConstPFEPtr pAddend2);
518 
539 MOC_EXTERN MSTATUS PRIMEFIELD_subtract2( PrimeFieldPtr pField, PFEPtr pResult, ConstPFEPtr pMinuend, ConstPFEPtr pSubtrahend);
540 
553 MOC_EXTERN MSTATUS PRIMEFIELD_additiveInvert(PrimeFieldPtr pField, PFEPtr pA);
554 
575 MOC_EXTERN MSTATUS PRIMEFIELD_specialExp448( PFEPtr pResult, ConstPFEPtr pA, byteBoolean isInverse);
576 
577 #if (defined(__ENABLE_MOCANA_VLONG_ECC_CONVERSION__))
578 
596 MOC_EXTERN MSTATUS PRIMEFIELD_newElementFromVlong( PrimeFieldPtr pField, const vlong* pV,
597  PFEPtr* ppNewElem);
598 
616 MOC_EXTERN MSTATUS PRIMEFIELD_newVlongFromElement( PrimeFieldPtr pField, ConstPFEPtr pElem,
617  vlong** ppNewElem, vlong** ppQueue);
618 
635 MOC_EXTERN MSTATUS PRIMEFIELD_getPrime( PrimeFieldPtr pField, vlong** ppPrime);
636 
656 MOC_EXTERN MSTATUS PRIMEFIELD_newMpintFromElement(PrimeFieldPtr pField, ConstPFEPtr pElem, ubyte** ppNewMpint, sbyte4 *pRetMpintLength, vlong** ppVlongQueue);
657 
680 MOC_EXTERN MSTATUS PRIMEFIELD_newElementFromMpint(const ubyte* pBuffer, ubyte4 bufSize, ubyte4 *pBufIndex, PrimeFieldPtr pField, PFEPtr* ppNewElem);
681 #endif
682 
683 #endif /* __ENABLE_MOCANA_ECC__ */
684 
685 #ifdef __cplusplus
686 }
687 #endif
688 
689 #endif /* __PRIMEFLD_HEADER__ */
690 
MOC_EXTERN MSTATUS PRIMEFIELD_specialExp448(PFEPtr pResult, ConstPFEPtr pA, byteBoolean isInverse)
Special finite field exponentiation for inverses or square roots.
MOC_EXTERN MSTATUS PRIMEFIELD_barrettMultiply(PrimeFieldPtr pField, PFEPtr pProduct, ConstPFEPtr pA, ConstPFEPtr pB, ConstPFEPtr pModulo, ConstPFEPtr pMu)
Performs an arbitrary modular multiplication with the Barrett reduction routine.
MOC_EXTERN MSTATUS PRIMEFIELD_inverse(PrimeFieldPtr pField, PFEPtr pInverse, ConstPFEPtr pA)
Multiplicatively inverts a prime field element.
MOC_EXTERN MSTATUS PRIMEFIELD_newElement(PrimeFieldPtr pField, PFEPtr *ppNewElem)
Allocates a new prime field element.
MOC_EXTERN MSTATUS PRIMEFIELD_deleteElement(PrimeFieldPtr pField, PFEPtr *ppDeleteElem)
Deletes a prime field element.
MOC_EXTERN MSTATUS PRIMEFIELD_getBit(PrimeFieldPtr pField, ConstPFEPtr pA, ubyte4 bitNum, ubyte *bit)
Gets a bit in a prime field element.
MOC_EXTERN sbyte4 PRIMEFIELD_cmpToUnsigned(PrimeFieldPtr pField, ConstPFEPtr pA, ubyte4 val)
Compares a prime field element to an unsigned small integer.
MOC_EXTERN MSTATUS PRIMEFIELD_newVlongFromElement(PrimeFieldPtr pField, ConstPFEPtr pElem, vlong **ppNewElem, vlong **ppQueue)
Creates a new vlong from a prime field element.
MOC_EXTERN MSTATUS PRIMEFIELD_inverseAux(sbyte4 k, PFEPtr pInverse, ConstPFEPtr pA, ConstPFEPtr pModulus)
Performs an arbitrary modular inversion.
MOC_EXTERN MSTATUS PRIMEFIELD_writeByteString(PrimeFieldPtr pField, ConstPFEPtr pA, ubyte *b, sbyte4 len)
Writes a prime field element to an existing byte array.
MOC_EXTERN MSTATUS PRIMEFIELD_newElementFromMpint(const ubyte *pBuffer, ubyte4 bufSize, ubyte4 *pBufIndex, PrimeFieldPtr pField, PFEPtr *ppNewElem)
Creates a new prime field element from a multiple precision integer.
MOC_EXTERN MSTATUS PRIMEFIELD_newMpintFromElement(PrimeFieldPtr pField, ConstPFEPtr pElem, ubyte **ppNewMpint, sbyte4 *pRetMpintLength, vlong **ppVlongQueue)
Creates a new multiple precision integer from a prime field element.
MOC_EXTERN MSTATUS PRIMEFIELD_copyElement(PrimeFieldPtr pField, PFEPtr pDestElem, ConstPFEPtr pSrcElem)
Copies a prime field element.
MOC_EXTERN MSTATUS PRIMEFIELD_squareRoot(PrimeFieldPtr pField, PFEPtr pResult, ConstPFEPtr pA)
Computes the square root of a prime field element.
MOC_EXTERN MSTATUS PRIMEFIELD_newElementFromVlong(PrimeFieldPtr pField, const vlong *pV, PFEPtr *ppNewElem)
Creates a new prime field element from a vlong element.
MOC_EXTERN MSTATUS PRIMEFIELD_getElementByteStringLen(PrimeFieldPtr pField, sbyte4 *len)
Gets the length of an arbitrary prime field element when written as a byte array. ...
MOC_EXTERN MSTATUS PRIMEFIELD_getPrime(PrimeFieldPtr pField, vlong **ppPrime)
Gets the prime number associateed with the prime field as a new vlong.
MOC_EXTERN MSTATUS PRIMEFIELD_addAux(PrimeFieldPtr pField, PFEPtr pSumAndValue, ConstPFEPtr pAddend, ConstPFEPtr pModulus)
Performs an arbitrary modular addition.
MOC_EXTERN MSTATUS PRIMEFIELD_subtract2(PrimeFieldPtr pField, PFEPtr pResult, ConstPFEPtr pMinuend, ConstPFEPtr pSubtrahend)
Subtracts two prime field elements.
MOC_EXTERN MSTATUS PRIMEFIELD_add2(PrimeFieldPtr pField, PFEPtr pSum, ConstPFEPtr pAddend, ConstPFEPtr pAddend2)
Adds two prime field elements.
MOC_EXTERN intBoolean PRIMEFIELD_match(PrimeFieldPtr pField, ConstPFEPtr pA, ConstPFEPtr pB)
Tests equality for two prime field elements.
MOC_EXTERN MSTATUS PRIMEFIELD_setToByteString(PrimeFieldPtr pField, PFEPtr pA, const ubyte *b, sbyte4 len)
Sets a prime field element from a Big Endian byte array.
MOC_EXTERN MSTATUS PRIMEFIELD_shiftR(PrimeFieldPtr pField, PFEPtr pA)
Right bit shifts a prime field element a single bit.
MOC_EXTERN MSTATUS PRIMEFIELD_xor(PrimeFieldPtr pField, PFEPtr pResultAndValue, ConstPFEPtr pXor)
Xor's prime field elements.
MOC_EXTERN MSTATUS PRIMEFIELD_divide(PrimeFieldPtr pField, PFEPtr pResult, ConstPFEPtr pA, ConstPFEPtr pDivisor)
Multipies a prime field element by the inverse of another element.
MOC_EXTERN MSTATUS PRIMEFIELD_setToUnsigned(PrimeFieldPtr pField, PFEPtr pA, ubyte4 val)
Sets a prime field element to an unsigned small integer.
MOC_EXTERN MSTATUS PRIMEFIELD_add(PrimeFieldPtr pField, PFEPtr pSumAndValue, ConstPFEPtr pAddend)
Adds prime field elements.
MOC_EXTERN MSTATUS PRIMEFIELD_getAsByteString(PrimeFieldPtr pField, ConstPFEPtr pA, ubyte **b, sbyte4 *len)
Converts a prime field element to a Big Endian byte array.
MOC_EXTERN MSTATUS PRIMEFIELD_getAsByteString2(PrimeFieldPtr pField, ConstPFEPtr pA, ConstPFEPtr pB, ubyte **b, sbyte4 *len)
Converts two prime field elements to Big Endian byte arrays concatenated.
MOC_EXTERN sbyte4 PRIMEFIELD_cmp(PrimeFieldPtr pField, ConstPFEPtr pA, ConstPFEPtr pB)
Compares two prime field elements.
MOC_EXTERN MSTATUS PRIMEFIELD_subtract(PrimeFieldPtr pField, PFEPtr pResultAndValue, ConstPFEPtr pSubtract)
Subtracts prime field elements.
MOC_EXTERN MSTATUS PRIMEFIELD_multiply(PrimeFieldPtr pField, PFEPtr pProduct, ConstPFEPtr pA, ConstPFEPtr pB)
Multiplies prime field elements.
MOC_EXTERN MSTATUS PRIMEFIELD_additiveInvert(PrimeFieldPtr pField, PFEPtr pA)
Additively inverts a prime field element inplace.