32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL
43 #if (SAMA5D4_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
74 blockSize = (algo == SHA_MR_ALGO_SHA512) ? 128 : 64;
80 SHA->SHA_CR = SHA_CR_SWRST;
83 SHA->SHA_MR = SHA_MR_UIHV | SHA_MR_SMOD_MANUAL_START | algo;
86 SHA->SHA_CR = SHA_CR_WUIHV;
89 if(algo == SHA_MR_ALGO_SHA1)
97 else if(algo == SHA_MR_ALGO_SHA256)
120 SHA->SHA_IDATAR[10] =
HTOBE32(
h[11]);
121 SHA->SHA_IDATAR[11] =
HTOBE32(
h[10]);
122 SHA->SHA_IDATAR[12] =
HTOBE32(
h[13]);
123 SHA->SHA_IDATAR[13] =
HTOBE32(
h[12]);
124 SHA->SHA_IDATAR[14] =
HTOBE32(
h[15]);
125 SHA->SHA_IDATAR[15] =
HTOBE32(
h[14]);
130 SHA->SHA_CR = SHA_CR_FIRST;
133 while(
length >= blockSize)
136 p = (uint32_t *)
data;
137 SHA->SHA_IDATAR[0] =
p[0];
138 SHA->SHA_IDATAR[1] =
p[1];
139 SHA->SHA_IDATAR[2] =
p[2];
140 SHA->SHA_IDATAR[3] =
p[3];
141 SHA->SHA_IDATAR[4] =
p[4];
142 SHA->SHA_IDATAR[5] =
p[5];
143 SHA->SHA_IDATAR[6] =
p[6];
144 SHA->SHA_IDATAR[7] =
p[7];
145 SHA->SHA_IDATAR[8] =
p[8];
146 SHA->SHA_IDATAR[9] =
p[9];
147 SHA->SHA_IDATAR[10] =
p[10];
148 SHA->SHA_IDATAR[11] =
p[11];
149 SHA->SHA_IDATAR[12] =
p[12];
150 SHA->SHA_IDATAR[13] =
p[13];
151 SHA->SHA_IDATAR[14] =
p[14];
152 SHA->SHA_IDATAR[15] =
p[15];
155 if(algo == SHA_MR_ALGO_SHA512)
157 SHA->SHA_IODATAR[0] =
p[16];
158 SHA->SHA_IODATAR[1] =
p[17];
159 SHA->SHA_IODATAR[2] =
p[18];
160 SHA->SHA_IODATAR[3] =
p[19];
161 SHA->SHA_IODATAR[4] =
p[20];
162 SHA->SHA_IODATAR[5] =
p[21];
163 SHA->SHA_IODATAR[6] =
p[22];
164 SHA->SHA_IODATAR[7] =
p[23];
165 SHA->SHA_IODATAR[8] =
p[24];
166 SHA->SHA_IODATAR[9] =
p[25];
167 SHA->SHA_IODATAR[10] =
p[26];
168 SHA->SHA_IODATAR[11] =
p[27];
169 SHA->SHA_IODATAR[12] =
p[28];
170 SHA->SHA_IODATAR[13] =
p[29];
171 SHA->SHA_IODATAR[14] =
p[30];
172 SHA->SHA_IODATAR[15] =
p[31];
176 SHA->SHA_CR = SHA_CR_START;
179 while((SHA->SHA_ISR & SHA_ISR_DATRDY) == 0)
189 h[0] = SHA->SHA_IODATAR[0];
190 h[1] = SHA->SHA_IODATAR[1];
191 h[2] = SHA->SHA_IODATAR[2];
192 h[3] = SHA->SHA_IODATAR[3];
193 h[4] = SHA->SHA_IODATAR[4];
196 if(algo == SHA_MR_ALGO_SHA256 || algo == SHA_MR_ALGO_SHA512)
198 h[5] = SHA->SHA_IODATAR[5];
199 h[6] = SHA->SHA_IODATAR[6];
200 h[7] = SHA->SHA_IODATAR[7];
204 if(algo == SHA_MR_ALGO_SHA512)
206 h[8] = SHA->SHA_IODATAR[8];
207 h[9] = SHA->SHA_IODATAR[9];
208 h[10] = SHA->SHA_IODATAR[10];
209 h[11] = SHA->SHA_IODATAR[11];
210 h[12] = SHA->SHA_IODATAR[12];
211 h[13] = SHA->SHA_IODATAR[13];
212 h[14] = SHA->SHA_IODATAR[14];
213 h[15] = SHA->SHA_IODATAR[15];
221 #if (SHA1_SUPPORT == ENABLED)
231 context->
h[0] =
BETOH32(0x67452301);
232 context->
h[1] =
BETOH32(0xEFCDAB89);
233 context->
h[2] =
BETOH32(0x98BADCFE);
234 context->
h[3] =
BETOH32(0x10325476);
235 context->
h[4] =
BETOH32(0xC3D2E1F0);
291 if(context->
size == 64)
321 if(context->
size < 56)
323 paddingSize = 56 - context->
size;
327 paddingSize = 64 + 56 - context->
size;
334 for(i = 0; i < 8; i++)
336 context->
buffer[63 - i] = totalSize & 0xFF;
369 #if (SHA224_SUPPORT == ENABLED)
379 context->
h[0] =
BETOH32(0xC1059ED8);
380 context->
h[1] =
BETOH32(0x367CD507);
381 context->
h[2] =
BETOH32(0x3070DD17);
382 context->
h[3] =
BETOH32(0xF70E5939);
383 context->
h[4] =
BETOH32(0xFFC00B31);
384 context->
h[5] =
BETOH32(0x68581511);
385 context->
h[6] =
BETOH32(0x64F98FA7);
386 context->
h[7] =
BETOH32(0xBEFA4FA4);
395 #if (SHA256_SUPPORT == ENABLED)
405 context->
h[0] =
BETOH32(0x6A09E667);
406 context->
h[1] =
BETOH32(0xBB67AE85);
407 context->
h[2] =
BETOH32(0x3C6EF372);
408 context->
h[3] =
BETOH32(0xA54FF53A);
409 context->
h[4] =
BETOH32(0x510E527F);
410 context->
h[5] =
BETOH32(0x9B05688C);
411 context->
h[6] =
BETOH32(0x1F83D9AB);
412 context->
h[7] =
BETOH32(0x5BE0CD19);
468 if(context->
size == 64)
498 if(context->
size < 56)
500 paddingSize = 56 - context->
size;
504 paddingSize = 64 + 56 - context->
size;
511 for(i = 0; i < 8; i++)
513 context->
buffer[63 - i] = totalSize & 0xFF;
546 #if (SHA384_SUPPORT == ENABLED)
556 context->
h[0] =
BETOH64(0xCBBB9D5DC1059ED8);
557 context->
h[1] =
BETOH64(0x629A292A367CD507);
558 context->
h[2] =
BETOH64(0x9159015A3070DD17);
559 context->
h[3] =
BETOH64(0x152FECD8F70E5939);
560 context->
h[4] =
BETOH64(0x67332667FFC00B31);
561 context->
h[5] =
BETOH64(0x8EB44A8768581511);
562 context->
h[6] =
BETOH64(0xDB0C2E0D64F98FA7);
563 context->
h[7] =
BETOH64(0x47B5481DBEFA4FA4);
590 #if (SHA512_SUPPORT == ENABLED)
600 context->
h[0] =
BETOH64(0x6A09E667F3BCC908);
601 context->
h[1] =
BETOH64(0xBB67AE8584CAA73B);
602 context->
h[2] =
BETOH64(0x3C6EF372FE94F82B);
603 context->
h[3] =
BETOH64(0xA54FF53A5F1D36F1);
604 context->
h[4] =
BETOH64(0x510E527FADE682D1);
605 context->
h[5] =
BETOH64(0x9B05688C2B3E6C1F);
606 context->
h[6] =
BETOH64(0x1F83D9ABFB41BD6B);
607 context->
h[7] =
BETOH64(0x5BE0CD19137E2179);
663 if(context->
size == 128)
667 (uint32_t *) context->
h);
693 if(context->
size < 112)
695 paddingSize = 112 - context->
size;
699 paddingSize = 128 + 112 - context->
size;
706 for(i = 0; i < 16; i++)
708 context->
buffer[127 - i] = totalSize & 0xFF;
714 (uint32_t *) context->
h);
724 #if (SHA512_224_SUPPORT == ENABLED)
734 context->
h[0] =
BETOH64(0x8C3D37C819544DA2);
735 context->
h[1] =
BETOH64(0x73E1996689DCD4D6);
736 context->
h[2] =
BETOH64(0x1DFAB7AE32FF9C82);
737 context->
h[3] =
BETOH64(0x679DD514582F9FCF);
738 context->
h[4] =
BETOH64(0x0F6D2B697BD44DA8);
739 context->
h[5] =
BETOH64(0x77E36F7304C48942);
740 context->
h[6] =
BETOH64(0x3F9D85A86A1D36C8);
741 context->
h[7] =
BETOH64(0x1112E6AD91D692A1);
750 #if (SHA512_256_SUPPORT == ENABLED)
760 context->
h[0] =
BETOH64(0x22312194FC2BF72C);
761 context->
h[1] =
BETOH64(0x9F555FA3C84C64C2);
762 context->
h[2] =
BETOH64(0x2393B86B6F53B151);
763 context->
h[3] =
BETOH64(0x963877195940EABD);
764 context->
h[4] =
BETOH64(0x96283EE2A88EFFE3);
765 context->
h[5] =
BETOH64(0xBE5E1E2553863992);
766 context->
h[6] =
BETOH64(0x2B0199FC2C85B8AA);
767 context->
h[7] =
BETOH64(0x0EB72DDC81C52CA2);