16 #define ENABLE_DEBUG 0 19 #define CRPT_DBGMSG printf 21 #define CRPT_DBGMSG(...) do { } while (0) 41 static uint32_t g_AES_CTL[4];
42 static uint32_t g_TDES_CTL[4];
44 static char hex_char_tbl[] =
"0123456789abcdef";
46 static void dump_ecc_reg(
char *str, uint32_t
volatile regs[], int32_t count);
47 static char get_Nth_nibble_char(uint32_t val32, uint32_t idx);
48 static void Hex2Reg(
char input[], uint32_t
volatile reg[]);
49 static void Reg2Hex(int32_t count, uint32_t
volatile reg[],
char output[]);
50 static void Hex2RegEx(
char input[], uint32_t
volatile reg[],
int shift);
51 static char ch2hex(
char ch);
52 static int get_nibble_value(
char c);
71 void PRNG_Open(
CRPT_T *crpt, uint32_t u32KeySize, uint32_t u32SeedReload, uint32_t u32Seed)
104 for (i = 0U; i < wcnt; i++)
139 uint32_t u32OpMode, uint32_t u32KeySize, uint32_t u32SwapType)
146 g_AES_CTL[u32Channel] = crpt->
AES_CTL;
161 crpt->
AES_CTL = g_AES_CTL[u32Channel];
176 void AES_SetKey(
CRPT_T *crpt, uint32_t u32Channel, uint32_t au32Keys[], uint32_t u32KeySize)
178 uint32_t i, wcnt, key_reg_addr;
180 key_reg_addr = (uint32_t)&crpt->
AES0_KEY[0] + (u32Channel * 0x3CUL);
181 wcnt = 4UL + u32KeySize*2UL;
183 for (i = 0U; i < wcnt; i++)
185 outpw(key_reg_addr, au32Keys[i]);
199 uint32_t i, key_reg_addr;
201 key_reg_addr = (uint32_t)&crpt->
AES0_IV[0] + (u32Channel * 0x3CUL);
203 for (i = 0U; i < 4U; i++)
205 outpw(key_reg_addr, au32IV[i]);
220 uint32_t u32DstAddr, uint32_t u32TransCnt)
224 reg_addr = (uint32_t)&crpt->
AES0_SADDR + (u32Channel * 0x3CUL);
225 outpw(reg_addr, u32SrcAddr);
227 reg_addr = (uint32_t)&crpt->
AES0_DADDR + (u32Channel * 0x3CUL);
228 outpw(reg_addr, u32DstAddr);
230 reg_addr = (uint32_t)&crpt->
AES0_CNT + (u32Channel * 0x3CUL);
231 outpw(reg_addr, u32TransCnt);
258 void TDES_Open(
CRPT_T *crpt, uint32_t u32Channel, uint32_t u32EncDec, int32_t Is3DES, int32_t Is3Key,
259 uint32_t u32OpMode, uint32_t u32SwapType)
287 crpt->
TDES_CTL = g_TDES_CTL[u32Channel];
299 uint32_t i, reg_addr;
301 reg_addr = (uint32_t)&crpt->
TDES0_KEY1H + (0x40UL * u32Channel);
303 for (i = 0U; i < 3U; i++)
305 outpw(reg_addr, au32Keys[i][0]);
307 outpw(reg_addr, au32Keys[i][1]);
324 reg_addr = (uint32_t)&crpt->
TDES0_IVH + (u32Channel * 0x40UL);
325 outpw(reg_addr, u32IVH);
327 reg_addr = (uint32_t)&crpt->
TDES0_IVL + (u32Channel * 0x40UL);
328 outpw(reg_addr, u32IVL);
341 uint32_t u32DstAddr, uint32_t u32TransCnt)
345 reg_addr = (uint32_t)&crpt->
TDES0_SA + (u32Channel * 0x40UL);
346 outpw(reg_addr, u32SrcAddr);
348 reg_addr = (uint32_t)&crpt->
TDES0_DA + (u32Channel * 0x40UL);
349 outpw(reg_addr, u32DstAddr);
351 reg_addr = (uint32_t)&crpt->
TDES0_CNT + (u32Channel * 0x40UL);
352 outpw(reg_addr, u32TransCnt);
372 void SHA_Open(
CRPT_T *crpt, uint32_t u32OpMode, uint32_t u32SwapType, uint32_t hmac_key_len)
377 if (hmac_key_len != 0UL)
424 uint32_t i, wcnt, reg_addr;
450 reg_addr = (uint32_t)&(crpt->
HMAC_DGST[0]);
451 for (i = 0UL; i < wcnt; i++)
453 u32Digest[i] =
inpw(reg_addr);
466 #define ECCOP_POINT_MUL (0x0UL << CRPT_ECC_CTL_ECCOP_Pos) 467 #define ECCOP_MODULE (0x1UL << CRPT_ECC_CTL_ECCOP_Pos) 468 #define ECCOP_POINT_ADD (0x2UL << CRPT_ECC_CTL_ECCOP_Pos) 469 #define ECCOP_POINT_DOUBLE (0x0UL << CRPT_ECC_CTL_ECCOP_Pos) 471 #define MODOP_DIV (0x0UL << CRPT_ECC_CTL_MODOP_Pos) 472 #define MODOP_MUL (0x1UL << CRPT_ECC_CTL_MODOP_Pos) 473 #define MODOP_ADD (0x2UL << CRPT_ECC_CTL_MODOP_Pos) 474 #define MODOP_SUB (0x3UL << CRPT_ECC_CTL_MODOP_Pos) 486 typedef struct e_curve_t
499 int32_t irreducible_k1;
500 int32_t irreducible_k2;
501 int32_t irreducible_k3;
505 const ECC_CURVE _Curve[] =
511 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
512 "64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1",
513 "188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012",
514 "07192b95ffc8da78631011ed6b24cdd573f977a11e794811",
516 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
518 "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",
529 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
530 "b4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4",
531 "b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
532 "bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34",
534 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
536 "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
547 "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
548 "5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b",
549 "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
550 "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5",
552 "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
554 "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
565 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
566 "b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef",
567 "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7",
568 "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f",
570 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
572 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
583 "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
584 "051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00",
585 "0c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66",
586 "11839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650",
588 "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
590 "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
601 "00000000000000000000000000000000000000001",
602 "20a601907b8c953ca1481eb10512f78744a3205fd",
603 "3f0eba16286a2d57ea0991168d4994637e8343e36",
604 "0d51fbc6c71a0094fa2cdd545b11c5c0c797324f1",
606 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
608 "40000000000000000000292FE77E70C12A4234C33",
619 "00000000000000000000000000000000000000000000000000000000001",
620 "066647ede6c332c7f8c0923bb58213b333b20e9ce4281fe115f7d8f90ad",
621 "0fac9dfcbac8313bb2139f1bb755fef65bc391f8b36f8f8eb7371fd558b",
622 "1006a08a41903350678e58528bebf8a0beff867a7ca36716f7e01f81052",
624 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
626 "1000000000000000000000000000013E974E72F8A6922031D2603CFE0D7",
637 "00000000000000000000000000000000000000000000000000000000000000000000001",
638 "27b680ac8b8596da5a4af8a19a0303fca97fd7645309fa2a581485af6263e313b79a2f5",
639 "5f939258db7dd90e1934f8c70b0dfec2eed25b8557eac9c80e2e198f8cdbecd86b12053",
640 "3676854fe24141cb98fe6d4b20d02b4516ff702350eddb0826779c813f0df45be8112f4",
642 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
644 "3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307",
655 "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
656 "021a5c2c8ee9feb5c4b9a753b7b476b7fd6422ef1f3dd674761fa99d6ac27c8a9a197b272822f6cd57a55aa4f50ae317b13545f",
657 "15d4860d088ddb3496b0c6064756260441cde4af1771d4db01ffe5b34e59703dc255a868a1180515603aeab60794e54bb7996a7",
658 "061b1cfab6be5f32bbfa78324ed106a7636b9c5a7bd198d0158aa4f5488d08f38514f1fdf4b4f40d2181b3681c364ba0273c706",
660 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
662 "10000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173",
673 "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
674 "2f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a",
675 "303001d34b856296c16c0d40d3cd7750a93d1d2955fa80aa5f40fc8db7b2abdbde53950f4c0d293cdd711a35b67fb1499ae60038614f1394abfa3b4c850d927e1e7769c8eec2d19",
676 "37bf27342da639b6dccfffeb73d69d78c6c27a6009cbbca1980f8533921e8a684423e43bab08a576291af8f461bb2a8b3531d2f0485c19b16e2f1516e23dd3c1a4827af1b8ac15b",
678 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
680 "3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47",
691 "00000000000000000000000000000000000000001",
692 "00000000000000000000000000000000000000001",
693 "2fe13c0537bbc11acaa07d793de4e6d5e5c94eee8",
694 "289070fb05d38ff58321f2e800536d538ccdaa3d9",
696 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
698 "4000000000000000000020108A2E0CC0D99F8A5EF",
709 "00000000000000000000000000000000000000000000000000000000000",
710 "00000000000000000000000000000000000000000000000000000000001",
711 "17232ba853a7e731af129f22ff4149563a419c26bf50a4c9d6eefad6126",
712 "1db537dece819b7f70f555a67c427a8cd9bf18aeb9b56e0c11056fae6a3",
714 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
716 "8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF",
727 "00000000000000000000000000000000000000000000000000000000000000000000000",
728 "00000000000000000000000000000000000000000000000000000000000000000000001",
729 "503213f78ca44883f1a3b8162f188e553cd265f23c1567a16876913b0c2ac2458492836",
730 "1ccda380f1c9e318d90f95d07e5426fe87e45c0e8184698e45962364e34116177dd2259",
732 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
734 "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61",
745 "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
746 "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
747 "060f05f658f49c1ad3ab1890f7184210efd0987e307c84c27accfb8f9f67cc2c460189eb5aaaa62ee222eb1b35540cfe9023746",
748 "1e369050b7c4e42acba1dacbf04299c3460782f918ea427e6325165e9ea10e3da5f6c42e9c55215aa9ca27a5863ec48d8e0286b",
750 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
752 "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF",
763 "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
764 "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
765 "26eb7a859923fbc82189631f8103fe4ac9ca2970012d5d46024804801841ca44370958493b205e647da304db4ceb08cbbd1ba39494776fb988b47174dca88c7e2945283a01c8972",
766 "349dc807f4fbf374f4aeade3bca95314dd58cec9f307a54ffc61efc006d8a2c9d4979c0ac44aea74fbebbb9f772aedcb620b01a7ba7af1b320430c8591984f601cd4c143ef1c7a3",
768 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
770 "20000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001",
781 "00000000000000000000000000000000000000000",
782 "00000000000000000000000000000000000000003",
783 "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D",
784 "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D",
786 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37",
788 "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",
799 "00000000000000000000000000000000000000000000000000000000",
800 "00000000000000000000000000000000000000000000000000000005",
801 "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C",
802 "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5",
804 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D",
806 "0000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",
817 "0000000000000000000000000000000000000000000000000000000000000000",
818 "0000000000000000000000000000000000000000000000000000000000000007",
819 "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",
820 "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",
822 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",
824 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",
835 "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9",
836 "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6",
837 "8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262",
838 "547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997",
840 "A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377",
842 "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7",
853 "7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826",
854 "04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11",
855 "1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E",
856 "8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315",
858 "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53",
860 "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565",
871 "7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA",
872 "3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723",
873 "81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822",
874 "7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892",
876 "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3",
878 "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069",
887 static ECC_CURVE *pCurve;
888 static ECC_CURVE Curve_Copy;
890 static ECC_CURVE * get_curve(
E_ECC_CURVE ecc_curve);
892 static void run_ecc_codec(
CRPT_T *crpt, uint32_t mode);
894 static char temp_hex_str[160];
898 static void dump_ecc_reg(
char *str, uint32_t
volatile regs[], int32_t count)
902 printf(
"%s => ", str);
903 for (i = 0; i < count; i++)
905 printf(
"0x%08x ", regs[i]);
910 static void dump_ecc_reg(
char *str, uint32_t
volatile regs[], int32_t count)
915 static char ch2hex(
char ch)
921 else if ((ch <=
'z') && (ch >=
'a'))
932 static void Hex2Reg(
char input[], uint32_t
volatile reg[])
938 si = (int)strlen(input) - 1;
944 for (i = 0UL; (i < 8UL) && (si >= 0); i++)
946 hex = ch2hex(input[si]);
947 val32 |= (uint32_t)hex << (i * 4UL);
954 static void Hex2RegEx(
char input[], uint32_t
volatile reg[],
int shift)
960 si = (int)strlen(input) - 1;
966 for (i = 0UL; (i < 8UL) && (si >= 0L); i++)
968 hex = (uint32_t)ch2hex(input[si]);
971 val32 |= (uint32_t)((hex & 0xFUL) | carry) << (i * 4UL);
972 carry = (hex >> 4UL) & 0xFUL;
991 static char get_Nth_nibble_char(uint32_t val32, uint32_t idx)
993 return hex_char_tbl[ (val32 >> (idx * 4U)) & 0xfU ];
997 static void Reg2Hex(int32_t count, uint32_t
volatile reg[],
char output[])
1005 for (ri = 0; idx >= 0; ri++)
1007 for (i = 0UL; (i < 8UL) && (idx >= 0); i++)
1009 output[idx] = get_Nth_nibble_char(reg[ri], i);
1015 static ECC_CURVE * get_curve(
E_ECC_CURVE ecc_curve)
1018 ECC_CURVE *ret =
NULL;
1020 for (i = 0UL; i <
sizeof(_Curve) /
sizeof(ECC_CURVE); i++)
1022 if (ecc_curve == _Curve[i].curve_id)
1024 memcpy((
char *)&Curve_Copy, &_Curve[i],
sizeof(ECC_CURVE));
1039 pCurve = get_curve(ecc_curve);
1042 CRPT_DBGMSG(
"Cannot find curve %d!!\n", ecc_curve);
1048 for (i = 0; i < 18; i++)
1050 crpt->
ECC_A[i] = 0UL;
1051 crpt->
ECC_B[i] = 0UL;
1054 crpt->
ECC_N[i] = 0UL;
1057 Hex2Reg(pCurve->Ea, crpt->
ECC_A);
1058 Hex2Reg(pCurve->Eb, crpt->
ECC_B);
1059 Hex2Reg(pCurve->Px, crpt->
ECC_X1);
1060 Hex2Reg(pCurve->Py, crpt->
ECC_Y1);
1062 CRPT_DBGMSG(
"Key length = %d\n", pCurve->key_len);
1063 dump_ecc_reg(
"CRPT_ECC_CURVE_A", crpt->
ECC_A, 10);
1064 dump_ecc_reg(
"CRPT_ECC_CURVE_B", crpt->
ECC_B, 10);
1065 dump_ecc_reg(
"CRPT_ECC_POINT_X1", crpt->
ECC_X1, 10);
1066 dump_ecc_reg(
"CRPT_ECC_POINT_Y1", crpt->
ECC_Y1, 10);
1068 if (pCurve->GF == (
int)CURVE_GF_2M)
1070 crpt->
ECC_N[0] = 0x1UL;
1071 crpt->
ECC_N[(pCurve->key_len) / 32] |= (1UL << ((pCurve->key_len) % 32));
1072 crpt->
ECC_N[(pCurve->irreducible_k1) / 32] |= (1UL << ((pCurve->irreducible_k1) % 32));
1073 crpt->
ECC_N[(pCurve->irreducible_k2) / 32] |= (1UL << ((pCurve->irreducible_k2) % 32));
1074 crpt->
ECC_N[(pCurve->irreducible_k3) / 32] |= (1UL << ((pCurve->irreducible_k3) % 32));
1078 Hex2Reg(pCurve->Pp, crpt->
ECC_N);
1081 dump_ecc_reg(
"CRPT_ECC_CURVE_N", crpt->
ECC_N, 10);
1085 static int get_nibble_value(
char c)
1087 if ((c >=
'0') && (c <=
'9'))
1092 if ((c >=
'a') && (c <=
'f'))
1094 c = c -
'a' + (char)10;
1097 if ((c >=
'A') && (c <=
'F'))
1099 c = c -
'A' + (char)10;
1104 static int ecc_strcmp(
char *s1,
char *s2)
1108 while (*s1 ==
'0') s1++;
1109 while (*s2 ==
'0') s2++;
1111 for ( ; *s1 || *s2; s1++, s2++)
1113 if ((*s1 >=
'A') && (*s1 <=
'Z'))
1118 if ((*s2 >=
'A') && (*s2 <=
'Z'))
1129 volatile uint32_t g_ECC_done, g_ECCERR_done;
1150 g_ECCERR_done = 1UL;
1170 pCurve = get_curve(ecc_curve);
1176 if (strlen(private_k) < strlen(pCurve->Eorder))
1181 if (strlen(private_k) > strlen(pCurve->Eorder))
1186 for (i = 0UL; i < strlen(private_k); i++)
1188 if (get_nibble_value(private_k[i]) < get_nibble_value(pCurve->Eorder[i]))
1193 if (get_nibble_value(private_k[i]) > get_nibble_value(pCurve->Eorder[i]))
1216 if (ecc_init_curve(crpt, ecc_curve) != 0)
1223 for (i = 0; i < 18; i++)
1225 crpt->
ECC_K[i] = 0UL;
1227 Hex2Reg(private_k, crpt->
ECC_K);
1230 if (pCurve->GF == (
int)CURVE_GF_2M)
1240 g_ECC_done = g_ECCERR_done = 0UL;
1244 while ((g_ECC_done | g_ECCERR_done) == 0UL)
1248 Reg2Hex(pCurve->Echar, crpt->
ECC_X1, public_k1);
1249 Reg2Hex(pCurve->Echar, crpt->
ECC_Y1, public_k2);
1271 if (ecc_init_curve(crpt, ecc_curve) != 0)
1278 for (i = 0; i < 18; i++)
1282 crpt->
ECC_K[i] = 0UL;
1284 Hex2Reg(x1, crpt->
ECC_X1);
1285 Hex2Reg(y1, crpt->
ECC_Y1);
1286 Hex2Reg(k, crpt->
ECC_K);
1289 if (pCurve->GF == (
int)CURVE_GF_2M)
1299 g_ECC_done = g_ECCERR_done = 0UL;
1303 while ((g_ECC_done | g_ECCERR_done) == 0UL)
1307 Reg2Hex(pCurve->Echar, crpt->
ECC_X1, x2);
1308 Reg2Hex(pCurve->Echar, crpt->
ECC_Y1, y2);
1329 if (ecc_init_curve(crpt, ecc_curve) != 0)
1336 for (i = 0; i < 18; i++)
1338 crpt->
ECC_K[i] = 0UL;
1346 Hex2RegEx(private_k, crpt->
ECC_K, 1);
1351 Hex2RegEx(private_k, crpt->
ECC_K, 2);
1355 Hex2Reg(private_k, crpt->
ECC_K);
1358 Hex2Reg(public_k1, crpt->
ECC_X1);
1359 Hex2Reg(public_k2, crpt->
ECC_Y1);
1362 if (pCurve->GF == (
int)CURVE_GF_2M)
1371 g_ECC_done = g_ECCERR_done = 0UL;
1375 while ((g_ECC_done | g_ECCERR_done) == 0UL)
1379 Reg2Hex(pCurve->Echar, crpt->
ECC_X1, secret_z);
1387 static void run_ecc_codec(
CRPT_T *crpt, uint32_t mode)
1395 if (pCurve->GF == (
int)CURVE_GF_2M)
1407 g_ECC_done = g_ECCERR_done = 0UL;
1409 while ((g_ECC_done | g_ECCERR_done) == 0UL)
1432 char *d,
char *k,
char *R,
char *S)
1434 uint32_t
volatile temp_result1[18], temp_result2[18];
1437 if (ecc_init_curve(crpt, ecc_curve) != 0)
1473 for (i = 0; i < 18; i++)
1475 crpt->
ECC_K[i] = 0UL;
1477 Hex2Reg(k, crpt->
ECC_K);
1479 run_ecc_codec(crpt, ECCOP_POINT_MUL);
1482 for (i = 0; i < 18; i++)
1484 crpt->
ECC_N[i] = 0UL;
1486 Hex2Reg(pCurve->Eorder, crpt->
ECC_N);
1489 for (i = 0; i < 18; i++)
1494 run_ecc_codec(crpt, ECCOP_MODULE | MODOP_ADD);
1497 for (i = 0; i < 18; i++)
1499 temp_result1[i] = crpt->
ECC_X1[i];
1502 Reg2Hex(pCurve->Echar, temp_result1, R);
1538 for (i = 0; i < 18; i++)
1540 crpt->
ECC_N[i] = 0UL;
1542 Hex2Reg(pCurve->Eorder, crpt->
ECC_N);
1545 for (i = 0; i < 18; i++)
1552 for (i = 0; i < 18; i++)
1556 Hex2Reg(k, crpt->
ECC_X1);
1558 run_ecc_codec(crpt, ECCOP_MODULE | MODOP_DIV);
1561 Reg2Hex(pCurve->Echar, crpt->
ECC_X1, temp_hex_str);
1562 CRPT_DBGMSG(
"(7) output = %s\n", temp_hex_str);
1567 for (i = 0; i < 18; i++)
1569 temp_result2[i] = crpt->
ECC_X1[i];
1573 Reg2Hex(pCurve->Echar, temp_result2, temp_hex_str);
1574 CRPT_DBGMSG(
"k^-1 = %s\n", temp_hex_str);
1578 for (i = 0; i < 18; i++)
1580 crpt->
ECC_N[i] = 0UL;
1582 Hex2Reg(pCurve->Eorder, crpt->
ECC_N);
1585 for (i = 0; i < 18; i++)
1587 crpt->
ECC_X1[i] = temp_result1[i];
1590 for (i = 0; i < 18; i++)
1594 Hex2Reg(d, crpt->
ECC_Y1);
1596 run_ecc_codec(crpt, ECCOP_MODULE | MODOP_MUL);
1599 Reg2Hex(pCurve->Echar, crpt->
ECC_X1, temp_hex_str);
1600 CRPT_DBGMSG(
"(14) output = %s\n", temp_hex_str);
1604 for (i = 0; i < 18; i++)
1606 crpt->
ECC_N[i] = 0UL;
1608 Hex2Reg(pCurve->Eorder, crpt->
ECC_N);
1611 for (i = 0; i < 18; i++)
1615 Hex2Reg(message, crpt->
ECC_Y1);
1617 run_ecc_codec(crpt, ECCOP_MODULE | MODOP_ADD);
1620 Reg2Hex(pCurve->Echar, crpt->
ECC_X1, temp_hex_str);
1621 CRPT_DBGMSG(
"(20) output = %s\n", temp_hex_str);
1625 for (i = 0; i < 18; i++)
1627 crpt->
ECC_N[i] = 0UL;
1629 Hex2Reg(pCurve->Eorder, crpt->
ECC_N);
1632 for (i = 0; i < 18; i++)
1634 crpt->
ECC_Y1[i] = temp_result2[i];
1637 run_ecc_codec(crpt, ECCOP_MODULE | MODOP_MUL);
1640 for (i = 0; i < 18; i++)
1642 temp_result2[i] = crpt->
ECC_X1[i];
1645 Reg2Hex(pCurve->Echar, temp_result2, S);
1666 char *public_k1,
char *public_k2,
char *R,
char *S)
1668 uint32_t temp_result1[18], temp_result2[18];
1669 uint32_t temp_x[18], temp_y[18];
1691 if (ecc_init_curve(crpt, ecc_curve) != 0)
1699 for (i = 0; i < 18; i++)
1701 crpt->
ECC_N[i] = 0UL;
1703 Hex2Reg(pCurve->Eorder, crpt->
ECC_N);
1706 for (i = 0; i < 18; i++)
1713 for (i = 0; i < 18; i++)
1717 Hex2Reg(S, crpt->
ECC_X1);
1719 run_ecc_codec(crpt, ECCOP_MODULE | MODOP_DIV);
1722 for (i = 0; i < 18; i++)
1724 temp_result2[i] = crpt->
ECC_X1[i];
1728 CRPT_DBGMSG(
"e = %s\n", message);
1729 Reg2Hex(pCurve->Echar, temp_result2, temp_hex_str);
1730 CRPT_DBGMSG(
"w = %s\n", temp_hex_str);
1731 CRPT_DBGMSG(
"o = %s (order)\n", pCurve->Eorder);
1753 for (i = 0; i < 18; i++)
1755 crpt->
ECC_N[i] = 0UL;
1757 Hex2Reg(pCurve->Eorder, crpt->
ECC_N);
1760 for (i = 0; i < 18; i++)
1764 Hex2Reg(message, crpt->
ECC_X1);
1766 for (i = 0; i < 18; i++)
1768 crpt->
ECC_Y1[i] = temp_result2[i];
1771 run_ecc_codec(crpt, ECCOP_MODULE | MODOP_MUL);
1774 for (i = 0; i < 18; i++)
1776 temp_result1[i] = crpt->
ECC_X1[i];
1780 Reg2Hex(pCurve->Echar, temp_result1, temp_hex_str);
1781 CRPT_DBGMSG(
"u1 = %s\n", temp_hex_str);
1785 for (i = 0; i < 18; i++)
1787 crpt->
ECC_N[i] = 0UL;
1789 Hex2Reg(pCurve->Eorder, crpt->
ECC_N);
1792 for (i = 0; i < 18; i++)
1796 Hex2Reg(R, crpt->
ECC_X1);
1798 for (i = 0; i < 18; i++)
1800 crpt->
ECC_Y1[i] = temp_result2[i];
1803 run_ecc_codec(crpt, ECCOP_MODULE | MODOP_MUL);
1806 for (i = 0; i < 18; i++)
1808 temp_result2[i] = crpt->
ECC_X1[i];
1812 Reg2Hex(pCurve->Echar, temp_result2, temp_hex_str);
1813 CRPT_DBGMSG(
"u2 = %s\n", temp_hex_str);
1853 ecc_init_curve(crpt, ecc_curve);
1856 for (i = 0; i < 18; i++)
1858 crpt->
ECC_K[i] = temp_result1[i];
1861 run_ecc_codec(crpt, ECCOP_POINT_MUL);
1864 for (i = 0; i < 18; i++)
1866 temp_x[i] = crpt->
ECC_X1[i];
1867 temp_y[i] = crpt->
ECC_Y1[i];
1871 Reg2Hex(pCurve->Echar, temp_x, temp_hex_str);
1872 CRPT_DBGMSG(
"5-(7) u1*G, x = %s\n", temp_hex_str);
1873 Reg2Hex(pCurve->Echar, temp_y, temp_hex_str);
1874 CRPT_DBGMSG(
"5-(7) u1*G, y = %s\n", temp_hex_str);
1878 ecc_init_curve(crpt, ecc_curve);
1881 for (i = 0; i < 18; i++)
1887 Hex2Reg(public_k1, crpt->
ECC_X1);
1888 Hex2Reg(public_k2, crpt->
ECC_Y1);
1891 for (i = 0; i < 18; i++)
1893 crpt->
ECC_K[i] = temp_result2[i];
1896 run_ecc_codec(crpt, ECCOP_POINT_MUL);
1898 for (i = 0; i < 18; i++)
1900 temp_result1[i] = crpt->
ECC_X1[i];
1901 temp_result2[i] = crpt->
ECC_Y1[i];
1905 Reg2Hex(pCurve->Echar, temp_result1, temp_hex_str);
1906 CRPT_DBGMSG(
"5-(13) u2*Q, x = %s\n", temp_hex_str);
1907 Reg2Hex(pCurve->Echar, temp_result2, temp_hex_str);
1908 CRPT_DBGMSG(
"5-(13) u2*Q, y = %s\n", temp_hex_str);
1912 ecc_init_curve(crpt, ecc_curve);
1915 for (i = 0; i < 18; i++)
1917 crpt->
ECC_X1[i] = temp_result1[i];
1918 crpt->
ECC_Y1[i] = temp_result2[i];
1922 for (i = 0; i < 18; i++)
1924 crpt->
ECC_X2[i] = temp_x[i];
1925 crpt->
ECC_Y2[i] = temp_y[i];
1928 run_ecc_codec(crpt, ECCOP_POINT_ADD);
1931 for (i = 0; i < 18; i++)
1933 temp_x[i] = crpt->
ECC_X1[i];
1934 temp_y[i] = crpt->
ECC_Y1[i];
1938 Reg2Hex(pCurve->Echar, temp_x, temp_hex_str);
1939 CRPT_DBGMSG(
"5-(19) x' = %s\n", temp_hex_str);
1940 Reg2Hex(pCurve->Echar, temp_y, temp_hex_str);
1941 CRPT_DBGMSG(
"5-(19) y' = %s\n", temp_hex_str);
1945 for (i = 0; i < 18; i++)
1947 crpt->
ECC_N[i] = 0UL;
1949 Hex2Reg(pCurve->Eorder, crpt->
ECC_N);
1955 for (i = 0; i < 18; i++)
1957 crpt->
ECC_X1[i] = temp_x[i];
1962 Reg2Hex(pCurve->Echar, crpt->
ECC_X1, temp_hex_str);
1963 CRPT_DBGMSG(
"5-(21) x' = %s\n", temp_hex_str);
1964 Reg2Hex(pCurve->Echar, crpt->
ECC_Y1, temp_hex_str);
1965 CRPT_DBGMSG(
"5-(22) y' = %s\n", temp_hex_str);
1968 run_ecc_codec(crpt, ECCOP_MODULE | MODOP_ADD);
1971 Reg2Hex(pCurve->Echar, crpt->
ECC_X1, temp_hex_str);
1972 CRPT_DBGMSG(
"5-(27) x1' (mod n) = %s\n", temp_hex_str);
1977 if (ecc_strcmp(temp_hex_str, R) != 0)
1979 CRPT_DBGMSG(
"x1' (mod n) != R Test filed!!\n");
1980 CRPT_DBGMSG(
"Signature R [%s] is not matched with expected R [%s]!\n", temp_hex_str, R);
#define CRPT_ECC_CTL_FSEL_Msk
#define CRPT_AES_CTL_START_Msk
#define CRPT_AES_CTL_OUTSWAP_Pos
void AES_SetDMATransfer(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32SrcAddr, uint32_t u32DstAddr, uint32_t u32TransCnt)
Set AES DMA transfer configuration.
__I uint32_t HMAC_DGST[16]
void SHA_Open(CRPT_T *crpt, uint32_t u32OpMode, uint32_t u32SwapType, uint32_t hmac_key_len)
Open SHA encrypt function.
int32_t ECC_GenerateSecretZ(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char *private_k, char public_k1[], char public_k2[], char secret_z[])
Given a curve parameter, the other party's public key, and one's own private key to generate the secr...
#define CRPT_TDES_CTL_TMODE_Msk
void PRNG_Read(CRPT_T *crpt, uint32_t u32RandKey[])
Read the PRNG key.
#define CRPT_HMAC_CTL_OPMODE_Pos
#define CRPT_ECC_STS_BUSY_Msk
#define CRPT_INTSTS_ECCEIF_Msk
void AES_Open(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32EncDec, uint32_t u32OpMode, uint32_t u32KeySize, uint32_t u32SwapType)
Open AES encrypt/decrypt function.
void SHA_Start(CRPT_T *crpt, uint32_t u32DMAMode)
Start SHA encrypt.
#define CRPT_PRNG_CTL_KEYSZ_Msk
void AES_SetInitVect(CRPT_T *crpt, uint32_t u32Channel, uint32_t au32IV[])
Set AES initial vectors.
#define CRPT_PRNG_CTL_SEEDRLD_Msk
#define CRPT_AES_CTL_OPMODE_Pos
__IO uint32_t HMAC_KEYCNT
NuMicro peripheral access layer header file.
#define SYS_CSERVER_VERSION_Msk
void SHA_SetDMATransfer(CRPT_T *crpt, uint32_t u32SrcAddr, uint32_t u32TransCnt)
Set SHA DMA transfer.
int32_t ECC_VerifySignature(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char *message, char *public_k1, char *public_k2, char *R, char *S)
ECDSA dogotal signature verification.
void AES_Start(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32DMAMode)
Start AES encrypt/decrypt.
#define CRPT_PRNG_CTL_SEEDRLD_Pos
#define CRPT_HMAC_CTL_START_Msk
#define CRPT_INTSTS_ECCIF_Msk
#define CRPT_ECC_CTL_START_Msk
#define CRPT_TDES_CTL_BLKSWAP_Pos
#define CRPT_ECC_CTL_CURVEM_Pos
int ECC_IsPrivateKeyValid(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char private_k[])
Check if the private key is located in valid range of curve.
#define CRPT_TDES_CTL_CHANNEL_Pos
void PRNG_Open(CRPT_T *crpt, uint32_t u32KeySize, uint32_t u32SeedReload, uint32_t u32Seed)
Open PRNG function.
__IO uint32_t HMAC_DMACNT
__IO uint32_t AES0_KEY[8]
#define CRPT_ECC_CTL_ECCOP_Msk
#define CRPT_TDES_CTL_DMALAST_Pos
#define CRPT_AES_CTL_ENCRPT_Pos
#define CRPT_AES_CTL_CHANNEL_Pos
void TDES_SetInitVect(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32IVH, uint32_t u32IVL)
Set TDES initial vectors.
#define CRPT_TDES_CTL_ENCRPT_Pos
#define CRPT_HMAC_CTL_DMALAST_Pos
void SHA_Read(CRPT_T *crpt, uint32_t u32Digest[])
Read the SHA digest.
#define inpw(port)
Get a 32-bit unsigned value from specified I/O port.
#define CRPT_PRNG_CTL_KEYSZ_Pos
int32_t ECC_GeneratePublicKey(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char *private_k, char public_k1[], char public_k2[])
Given a private key and curve to generate the public key pair.
#define CRPT_PRNG_CTL_START_Msk
void ECC_Complete(CRPT_T *crpt)
ECC interrupt service routine. User application must invoke this function in his CRYPTO_IRQHandler() ...
void TDES_Start(CRPT_T *crpt, int32_t u32Channel, uint32_t u32DMAMode)
Start TDES encrypt/decrypt.
void TDES_Open(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32EncDec, int32_t Is3DES, int32_t Is3Key, uint32_t u32OpMode, uint32_t u32SwapType)
Open TDES encrypt/decrypt function.
int32_t ECC_GenerateSignature(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char *message, char *d, char *k, char *R, char *S)
ECDSA digital signature generation.
#define CRPT_AES_CTL_KEYSZ_Pos
void PRNG_Start(CRPT_T *crpt)
Start to generate one PRNG key.
void AES_SetKey(CRPT_T *crpt, uint32_t u32Channel, uint32_t au32Keys[], uint32_t u32KeySize)
Set AES keys.
#define CRPT_TDES_CTL_START_Msk
#define CRPT_HMAC_CTL_OPMODE_Msk
#define outpw(port, value)
Set a 32-bit unsigned value to specified I/O port.
int32_t ECC_Mutiply(CRPT_T *crpt, E_ECC_CURVE ecc_curve, char x1[], char y1[], char *k, char x2[], char y2[])
Given a private key and curve to generate the public key pair.
void TDES_SetDMATransfer(CRPT_T *crpt, uint32_t u32Channel, uint32_t u32SrcAddr, uint32_t u32DstAddr, uint32_t u32TransCnt)
Set TDES DMA transfer configuration.
__IO uint32_t TDES0_KEY1H
#define NULL
NULL pointer.
#define CRPT_HMAC_CTL_OUTSWAP_Pos
#define CRPT_AES_CTL_DMALAST_Pos
void TDES_SetKey(CRPT_T *crpt, uint32_t u32Channel, uint32_t au32Keys[3][2])
Set TDES keys.
#define CRPT_TDES_CTL_3KEYS_Msk