32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
43 #if (SAM9X7_CRYPTO_HASH_SUPPORT == ENABLED)
46 static const uint8_t padding[128] =
48 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
52 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
73 blockSize = (algo == SHA_MR_ALGO_SHA512) ? 128 : 64;
79 SHA_REGS->SHA_CR = SHA_CR_SWRST_Msk;
82 SHA_REGS->SHA_MR = SHA_MR_UIHV_Msk | SHA_MR_SMOD_MANUAL_START | algo;
85 SHA_REGS->SHA_CR = SHA_CR_WUIHV_Msk;
88 SHA_REGS->SHA_IDATAR[0] =
h[0];
89 SHA_REGS->SHA_IDATAR[1] =
h[1];
90 SHA_REGS->SHA_IDATAR[2] =
h[2];
91 SHA_REGS->SHA_IDATAR[3] =
h[3];
92 SHA_REGS->SHA_IDATAR[4] =
h[4];
95 if(algo == SHA_MR_ALGO_SHA256 || algo == SHA_MR_ALGO_SHA512)
97 SHA_REGS->SHA_IDATAR[5] =
h[5];
98 SHA_REGS->SHA_IDATAR[6] =
h[6];
99 SHA_REGS->SHA_IDATAR[7] =
h[7];
103 if(algo == SHA_MR_ALGO_SHA512)
105 SHA_REGS->SHA_IDATAR[8] =
h[8];
106 SHA_REGS->SHA_IDATAR[9] =
h[9];
107 SHA_REGS->SHA_IDATAR[10] =
h[10];
108 SHA_REGS->SHA_IDATAR[11] =
h[11];
109 SHA_REGS->SHA_IDATAR[12] =
h[12];
110 SHA_REGS->SHA_IDATAR[13] =
h[13];
111 SHA_REGS->SHA_IDATAR[14] =
h[14];
112 SHA_REGS->SHA_IDATAR[15] =
h[15];
117 SHA_REGS->SHA_CR = SHA_CR_FIRST_Msk;
120 while(
length >= blockSize)
141 if(algo == SHA_MR_ALGO_SHA512)
162 SHA_REGS->SHA_CR = SHA_CR_START_Msk;
165 while((SHA_REGS->SHA_ISR & SHA_ISR_DATRDY_Msk) == 0)
175 h[0] = SHA_REGS->SHA_IODATAR[0];
176 h[1] = SHA_REGS->SHA_IODATAR[1];
177 h[2] = SHA_REGS->SHA_IODATAR[2];
178 h[3] = SHA_REGS->SHA_IODATAR[3];
179 h[4] = SHA_REGS->SHA_IODATAR[4];
182 if(algo == SHA_MR_ALGO_SHA256 || algo == SHA_MR_ALGO_SHA512)
184 h[5] = SHA_REGS->SHA_IODATAR[5];
185 h[6] = SHA_REGS->SHA_IODATAR[6];
186 h[7] = SHA_REGS->SHA_IODATAR[7];
190 if(algo == SHA_MR_ALGO_SHA512)
192 h[8] = SHA_REGS->SHA_IODATAR[8];
193 h[9] = SHA_REGS->SHA_IODATAR[9];
194 h[10] = SHA_REGS->SHA_IODATAR[10];
195 h[11] = SHA_REGS->SHA_IODATAR[11];
196 h[12] = SHA_REGS->SHA_IODATAR[12];
197 h[13] = SHA_REGS->SHA_IODATAR[13];
198 h[14] = SHA_REGS->SHA_IODATAR[14];
199 h[15] = SHA_REGS->SHA_IODATAR[15];
207 #if (SHA1_SUPPORT == ENABLED)
217 context->
h[0] =
BETOH32(0x67452301);
218 context->
h[1] =
BETOH32(0xEFCDAB89);
219 context->
h[2] =
BETOH32(0x98BADCFE);
220 context->
h[3] =
BETOH32(0x10325476);
221 context->
h[4] =
BETOH32(0xC3D2E1F0);
277 if(context->
size == 64)
307 if(context->
size < 56)
309 paddingSize = 56 - context->
size;
313 paddingSize = 64 + 56 - context->
size;
320 for(i = 0; i < 8; i++)
322 context->
buffer[63 - i] = totalSize & 0xFF;
355 #if (SHA224_SUPPORT == ENABLED)
365 context->
h[0] =
BETOH32(0xC1059ED8);
366 context->
h[1] =
BETOH32(0x367CD507);
367 context->
h[2] =
BETOH32(0x3070DD17);
368 context->
h[3] =
BETOH32(0xF70E5939);
369 context->
h[4] =
BETOH32(0xFFC00B31);
370 context->
h[5] =
BETOH32(0x68581511);
371 context->
h[6] =
BETOH32(0x64F98FA7);
372 context->
h[7] =
BETOH32(0xBEFA4FA4);
381 #if (SHA256_SUPPORT == ENABLED)
391 context->
h[0] =
BETOH32(0x6A09E667);
392 context->
h[1] =
BETOH32(0xBB67AE85);
393 context->
h[2] =
BETOH32(0x3C6EF372);
394 context->
h[3] =
BETOH32(0xA54FF53A);
395 context->
h[4] =
BETOH32(0x510E527F);
396 context->
h[5] =
BETOH32(0x9B05688C);
397 context->
h[6] =
BETOH32(0x1F83D9AB);
398 context->
h[7] =
BETOH32(0x5BE0CD19);
454 if(context->
size == 64)
484 if(context->
size < 56)
486 paddingSize = 56 - context->
size;
490 paddingSize = 64 + 56 - context->
size;
497 for(i = 0; i < 8; i++)
499 context->
buffer[63 - i] = totalSize & 0xFF;
532 #if (SHA384_SUPPORT == ENABLED)
542 context->
h[0] =
BETOH64(0xCBBB9D5DC1059ED8);
543 context->
h[1] =
BETOH64(0x629A292A367CD507);
544 context->
h[2] =
BETOH64(0x9159015A3070DD17);
545 context->
h[3] =
BETOH64(0x152FECD8F70E5939);
546 context->
h[4] =
BETOH64(0x67332667FFC00B31);
547 context->
h[5] =
BETOH64(0x8EB44A8768581511);
548 context->
h[6] =
BETOH64(0xDB0C2E0D64F98FA7);
549 context->
h[7] =
BETOH64(0x47B5481DBEFA4FA4);
576 #if (SHA512_SUPPORT == ENABLED)
586 context->
h[0] =
BETOH64(0x6A09E667F3BCC908);
587 context->
h[1] =
BETOH64(0xBB67AE8584CAA73B);
588 context->
h[2] =
BETOH64(0x3C6EF372FE94F82B);
589 context->
h[3] =
BETOH64(0xA54FF53A5F1D36F1);
590 context->
h[4] =
BETOH64(0x510E527FADE682D1);
591 context->
h[5] =
BETOH64(0x9B05688C2B3E6C1F);
592 context->
h[6] =
BETOH64(0x1F83D9ABFB41BD6B);
593 context->
h[7] =
BETOH64(0x5BE0CD19137E2179);
649 if(context->
size == 128)
653 (uint32_t *) context->
h);
679 if(context->
size < 112)
681 paddingSize = 112 - context->
size;
685 paddingSize = 128 + 112 - context->
size;
692 for(i = 0; i < 16; i++)
694 context->
buffer[127 - i] = totalSize & 0xFF;
700 (uint32_t *) context->
h);
710 #if (SHA512_224_SUPPORT == ENABLED)
720 context->
h[0] =
BETOH64(0x8C3D37C819544DA2);
721 context->
h[1] =
BETOH64(0x73E1996689DCD4D6);
722 context->
h[2] =
BETOH64(0x1DFAB7AE32FF9C82);
723 context->
h[3] =
BETOH64(0x679DD514582F9FCF);
724 context->
h[4] =
BETOH64(0x0F6D2B697BD44DA8);
725 context->
h[5] =
BETOH64(0x77E36F7304C48942);
726 context->
h[6] =
BETOH64(0x3F9D85A86A1D36C8);
727 context->
h[7] =
BETOH64(0x1112E6AD91D692A1);
736 #if (SHA512_256_SUPPORT == ENABLED)
746 context->
h[0] =
BETOH64(0x22312194FC2BF72C);
747 context->
h[1] =
BETOH64(0x9F555FA3C84C64C2);
748 context->
h[2] =
BETOH64(0x2393B86B6F53B151);
749 context->
h[3] =
BETOH64(0x963877195940EABD);
750 context->
h[4] =
BETOH64(0x96283EE2A88EFFE3);
751 context->
h[5] =
BETOH64(0xBE5E1E2553863992);
752 context->
h[6] =
BETOH64(0x2B0199FC2C85B8AA);
753 context->
h[7] =
BETOH64(0x0EB72DDC81C52CA2);