Go to the documentation of this file.
32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
35 #include "mxc_device.h"
49 #if (MAX32690_CRYPTO_PKC_SUPPORT == ENABLED)
65 p = (uint32_t *) (MXC_BASE_CTB + offset);
74 for(i = 1; i < (
length * 2); i++)
94 p = (uint32_t *) (MXC_BASE_CTB + offset);
100 for(i = 0; i <
length; i++)
123 volatile uint32_t *
p;
126 p = (uint32_t *) (MXC_BASE_CTB + offset);
132 for(i = 0; i < src->
size && i < (
length * 2); i++)
155 volatile uint32_t *
p;
158 p = (uint32_t *) (MXC_BASE_CTB + offset);
164 for(i = 0; i <
length; i++)
183 volatile uint32_t *
p;
186 p = (uint32_t *) (MXC_BASE_CTB + offset);
198 for(i = 0; i <
length; i++)
200 dest->
data[i] =
p[i];
204 for(; i < dest->
size; i++)
218 #if (MPI_SUPPORT == ENABLED)
244 MXC_CTB->ctrl = MXC_F_CTB_CTRL_RST;
248 while((MXC_CTB->ctrl & MXC_F_CTB_CTRL_RDY) == 0)
253 MXC_CTB->ctrl |= MXC_F_CTB_CTRL_FLAG_MODE;
256 MXC_CTB->maa_maws = modLen;
321 MXC_CTB->ctrl = MXC_F_CTB_CTRL_RST;
325 while((MXC_CTB->ctrl & MXC_F_CTB_CTRL_RDY) == 0)
330 MXC_CTB->ctrl |= MXC_F_CTB_CTRL_FLAG_MODE;
333 MXC_CTB->maa_maws = modLen;
374 #if (EC_SUPPORT == ENABLED)
390 modLen = curve->fieldSize;
396 MXC_CTB->ctrl = MXC_F_CTB_CTRL_RST;
400 while((MXC_CTB->ctrl & MXC_F_CTB_CTRL_RDY) == 0)
405 MXC_CTB->ctrl |= MXC_F_CTB_CTRL_FLAG_MODE;
408 MXC_CTB->maa_maws = modLen;
452 modLen = curve->fieldSize;
458 MXC_CTB->ctrl = MXC_F_CTB_CTRL_RST;
462 while((MXC_CTB->ctrl & MXC_F_CTB_CTRL_RDY) == 0)
467 MXC_CTB->ctrl |= MXC_F_CTB_CTRL_FLAG_MODE;
470 MXC_CTB->maa_maws = modLen;
514 if(curve->fieldInv == NULL)
517 modLen = curve->fieldSize;
523 MXC_CTB->ctrl = MXC_F_CTB_CTRL_RST;
527 while((MXC_CTB->ctrl & MXC_F_CTB_CTRL_RDY) == 0)
532 MXC_CTB->ctrl |= MXC_F_CTB_CTRL_FLAG_MODE;
535 MXC_CTB->maa_maws = modLen;
568 modLen = (curve->fieldSize + 31) / 32;
572 curve->fieldMod(curve,
r,
u);
589 if(curve->fieldInv == NULL)
592 modLen = curve->fieldSize;
598 MXC_CTB->ctrl = MXC_F_CTB_CTRL_RST;
602 while((MXC_CTB->ctrl & MXC_F_CTB_CTRL_RDY) == 0)
607 MXC_CTB->ctrl |= MXC_F_CTB_CTRL_FLAG_MODE;
610 MXC_CTB->maa_maws = modLen;
641 modLen = (curve->fieldSize + 31) / 32;
645 curve->fieldMod(curve,
r,
u);
664 orderLen = curve->orderSize;
670 MXC_CTB->ctrl = MXC_F_CTB_CTRL_RST;
674 while((MXC_CTB->ctrl & MXC_F_CTB_CTRL_RDY) == 0)
679 MXC_CTB->ctrl |= MXC_F_CTB_CTRL_FLAG_MODE;
682 MXC_CTB->maa_maws = orderLen;
724 orderLen = curve->orderSize;
730 MXC_CTB->ctrl = MXC_F_CTB_CTRL_RST;
734 while((MXC_CTB->ctrl & MXC_F_CTB_CTRL_RDY) == 0)
739 MXC_CTB->ctrl |= MXC_F_CTB_CTRL_FLAG_MODE;
742 MXC_CTB->maa_maws = orderLen;
770 #if (X25519_SUPPORT == ENABLED || ED25519_SUPPORT == ENABLED)
781 volatile uint32_t *
p;
787 MXC_CTB->ctrl = MXC_F_CTB_CTRL_RST;
791 while((MXC_CTB->ctrl & MXC_F_CTB_CTRL_RDY) == 0)
796 MXC_CTB->ctrl |= MXC_F_CTB_CTRL_FLAG_MODE;
799 MXC_CTB->maa_maws = 255;
863 #if (X448_SUPPORT == ENABLED || ED448_SUPPORT == ENABLED)
874 volatile uint32_t *
p;
880 MXC_CTB->ctrl = MXC_F_CTB_CTRL_RST;
884 while((MXC_CTB->ctrl & MXC_F_CTB_CTRL_RDY) == 0)
889 MXC_CTB->ctrl |= MXC_F_CTB_CTRL_FLAG_MODE;
892 MXC_CTB->maa_maws = 448;
896 p[0] = (
a[1] << 28) |
a[0];
897 p[1] = (
a[2] << 24) | (
a[1] >> 4);
898 p[2] = (
a[3] << 20) | (
a[2] >> 8);
899 p[3] = (
a[4] << 16) | (
a[3] >> 12);
900 p[4] = (
a[5] << 12) | (
a[4] >> 16);
901 p[5] = (
a[6] << 8) | (
a[5] >> 20);
902 p[6] = (
a[7] << 4) | (
a[6] >> 24);
903 p[7] = (
a[9] << 28) |
a[8];
904 p[8] = (
a[10] << 24) | (
a[9] >> 4);
905 p[9] = (
a[11] << 20) | (
a[10] >> 8);
906 p[10] = (
a[12] << 16) | (
a[11] >> 12);
907 p[11] = (
a[13] << 12) | (
a[12] >> 16);
908 p[12] = (
a[14] << 8) | (
a[13] >> 20);
909 p[13] = (
a[15] << 4) | (
a[14] >> 24);
913 p[0] = (
b[1] << 28) |
b[0];
914 p[1] = (
b[2] << 24) | (
b[1] >> 4);
915 p[2] = (
b[3] << 20) | (
b[2] >> 8);
916 p[3] = (
b[4] << 16) | (
b[3] >> 12);
917 p[4] = (
b[5] << 12) | (
b[4] >> 16);
918 p[5] = (
b[6] << 8) | (
b[5] >> 20);
919 p[6] = (
b[7] << 4) | (
b[6] >> 24);
920 p[7] = (
b[9] << 28) |
b[8];
921 p[8] = (
b[10] << 24) | (
b[9] >> 4);
922 p[9] = (
b[11] << 20) | (
b[10] >> 8);
923 p[10] = (
b[12] << 16) | (
b[11] >> 12);
924 p[11] = (
b[13] << 12) | (
b[12] >> 16);
925 p[12] = (
b[14] << 8) | (
b[13] >> 20);
926 p[13] = (
b[15] << 4) | (
b[14] >> 24);
960 r[0] =
p[0] & 0x0FFFFFFF;
961 r[1] =
p[0] >> 28 | ((
p[1] << 4) & 0x0FFFFFF0);
962 r[2] =
p[1] >> 24 | ((
p[2] << 8) & 0x0FFFFF00);
963 r[3] =
p[2] >> 20 | ((
p[3] << 12) & 0x0FFFF000);
964 r[4] =
p[3] >> 16 | ((
p[4] << 16) & 0x0FFF0000);
965 r[5] =
p[4] >> 12 | ((
p[5] << 20) & 0x0FF00000);
966 r[6] =
p[5] >> 8 | ((
p[6] << 24) & 0x0F000000);
968 r[8] =
p[7] & 0x0FFFFFFF;
969 r[9] =
p[7] >> 28 | ((
p[8] << 4) & 0x0FFFFFF0);
970 r[10] =
p[8] >> 24 | ((
p[9] << 8) & 0x0FFFFF00);
971 r[11] =
p[9] >> 20 | ((
p[10] << 12) & 0x0FFFF000);
972 r[12] =
p[10] >> 16 | ((
p[11] << 16) & 0x0FFF0000);
973 r[13] =
p[11] >> 12 | ((
p[12] << 20) & 0x0FF00000);
974 r[14] =
p[12] >> 8 | ((
p[13] << 24) & 0x0F000000);
void curve25519Mul2(uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular multiplication.
Curve448 elliptic curve (constant-time implementation)
#define CTB_MAA_CTRL_AMA(n)
void maaSetValue(uint_t offset, uint32_t value, uint_t length)
Set operand value.
__weak_func void ecScalarSqr(uint32_t *r, const uint32_t *a, uint_t n)
Squaring operation.
MAX32690 hardware cryptographic accelerator.
Arbitrary precision integer.
#define CTB_MAA_CTRL_CALC_MOD_EXP_Val
#define CTB_MAA_CTRL_OPT_Msk
#define CTB_MAA_CTRL_CALC_MOD_SUB_Val
void ecFieldSubMod2(const EcCurve *curve, uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular subtraction.
#define CTB_MAA_CTRL_START_Msk
void ecFieldAddMod2(const EcCurve *curve, uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular addition.
#define CTB_MAA_MEM_INSTANCE_1
void ecScalarSqrMod(const EcCurve *curve, uint32_t *r, const uint32_t *a)
Modular squaring.
error_t maaExportMpi(uint_t offset, Mpi *dest, uint_t length)
Export multiple-precision integer.
#define CTB_MAA_CTRL_RMA(n)
error_t mpiExpModFast(Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
Modular exponentiation (fast calculation)
void ecScalarMulMod(const EcCurve *curve, uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular multiplication.
MAX32690 public-key hardware accelerator.
MPI (Multiple Precision Integer Arithmetic)
#define CTB_MAA_CTRL_CALC_MOD_ADD_Val
General definitions for cryptographic algorithms.
#define CTB_MAA_MEM_INSTANCE_5
uint_t mpiGetBitLength(const Mpi *a)
Get the actual length in bits.
#define CTB_MAA_MEM_INSTANCE_2
void maaImportScalar(uint_t offset, const uint32_t *src, uint_t length)
Import scalar.
void maaExportScalar(uint_t offset, uint32_t *dest, uint_t length)
Export scalar.
#define CTB_MAA_MEM_INSTANCE_0
#define CTB_MAA_MEM_INSTANCE_4
void osAcquireMutex(OsMutex *mutex)
Acquire ownership of the specified mutex object.
void maaImportMpi(uint_t offset, const Mpi *src, uint_t length)
Import multiple-precision integer.
void osReleaseMutex(OsMutex *mutex)
Release ownership of the specified mutex object.
#define CTB_MAA_CTRL_TMA(n)
#define CTB_MAA_CTRL_CALC_MOD_MUL_Val
#define CTB_MAA_CTRL_CALC_MOD_SQR_Val
Curve25519 elliptic curve (constant-time implementation)
OsMutex max32690CryptoMutex
#define TB_CTRL_MAA_DONE_Msk
void ecFieldMulMod(const EcCurve *curve, uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular multiplication.
#define CTB_MAA_CTRL_BMA(n)
__weak_func void ecScalarMul(uint32_t *rl, uint32_t *rh, const uint32_t *a, const uint32_t *b, uint_t n)
Multiplication of two integers.
ECC (Elliptic Curve Cryptography)
error_t mpiGrow(Mpi *r, uint_t size)
Adjust the size of multiple precision integer.
#define CTB_MAA_CTRL_CALC(n)
void ecFieldSqrMod(const EcCurve *curve, uint32_t *r, const uint32_t *a)
Modular squaring.
error_t mpiExpMod(Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
Modular exponentiation.
#define EC_MAX_MODULUS_SIZE
void curve448Mul2(uint32_t *r, const uint32_t *a, const uint32_t *b)
Modular multiplication.
error_t mpiExpModRegular(Mpi *r, const Mpi *a, const Mpi *e, const Mpi *p)
Modular exponentiation (regular calculation)