32 #define TRACE_LEVEL CRYPTO_TRACE_LEVEL 
   43 #if (PIC32CX_MT_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_REGS->SHA_CR = SHA_CR_SWRST_Msk;
 
   83    SHA_REGS->SHA_MR = SHA_MR_UIHV_Msk | SHA_MR_SMOD_MANUAL_START | algo;
 
   86    SHA_REGS->SHA_CR = SHA_CR_WUIHV_Msk;
 
   89    SHA_REGS->SHA_IDATAR[0] = 
h[0];
 
   90    SHA_REGS->SHA_IDATAR[1] = 
h[1];
 
   91    SHA_REGS->SHA_IDATAR[2] = 
h[2];
 
   92    SHA_REGS->SHA_IDATAR[3] = 
h[3];
 
   93    SHA_REGS->SHA_IDATAR[4] = 
h[4];
 
   96    if(algo == SHA_MR_ALGO_SHA256 || algo == SHA_MR_ALGO_SHA512)
 
   98       SHA_REGS->SHA_IDATAR[5] = 
h[5];
 
   99       SHA_REGS->SHA_IDATAR[6] = 
h[6];
 
  100       SHA_REGS->SHA_IDATAR[7] = 
h[7];
 
  104    if(algo == SHA_MR_ALGO_SHA512)
 
  106       SHA_REGS->SHA_IDATAR[8] = 
h[8];
 
  107       SHA_REGS->SHA_IDATAR[9] = 
h[9];
 
  108       SHA_REGS->SHA_IDATAR[10] = 
h[10];
 
  109       SHA_REGS->SHA_IDATAR[11] = 
h[11];
 
  110       SHA_REGS->SHA_IDATAR[12] = 
h[12];
 
  111       SHA_REGS->SHA_IDATAR[13] = 
h[13];
 
  112       SHA_REGS->SHA_IDATAR[14] = 
h[14];
 
  113       SHA_REGS->SHA_IDATAR[15] = 
h[15];
 
  118    SHA_REGS->SHA_CR = SHA_CR_FIRST_Msk;
 
  121    while(
length >= blockSize)
 
  124       p = (uint32_t *) 
data;
 
  125       SHA_REGS->SHA_IDATAR[0] = 
p[0];
 
  126       SHA_REGS->SHA_IDATAR[1] = 
p[1];
 
  127       SHA_REGS->SHA_IDATAR[2] = 
p[2];
 
  128       SHA_REGS->SHA_IDATAR[3] = 
p[3];
 
  129       SHA_REGS->SHA_IDATAR[4] = 
p[4];
 
  130       SHA_REGS->SHA_IDATAR[5] = 
p[5];
 
  131       SHA_REGS->SHA_IDATAR[6] = 
p[6];
 
  132       SHA_REGS->SHA_IDATAR[7] = 
p[7];
 
  133       SHA_REGS->SHA_IDATAR[8] = 
p[8];
 
  134       SHA_REGS->SHA_IDATAR[9] = 
p[9];
 
  135       SHA_REGS->SHA_IDATAR[10] = 
p[10];
 
  136       SHA_REGS->SHA_IDATAR[11] = 
p[11];
 
  137       SHA_REGS->SHA_IDATAR[12] = 
p[12];
 
  138       SHA_REGS->SHA_IDATAR[13] = 
p[13];
 
  139       SHA_REGS->SHA_IDATAR[14] = 
p[14];
 
  140       SHA_REGS->SHA_IDATAR[15] = 
p[15];
 
  143       if(algo == SHA_MR_ALGO_SHA512)
 
  145          SHA_REGS->SHA_IODATAR[0] = 
p[16];
 
  146          SHA_REGS->SHA_IODATAR[1] = 
p[17];
 
  147          SHA_REGS->SHA_IODATAR[2] = 
p[18];
 
  148          SHA_REGS->SHA_IODATAR[3] = 
p[19];
 
  149          SHA_REGS->SHA_IODATAR[4] = 
p[20];
 
  150          SHA_REGS->SHA_IODATAR[5] = 
p[21];
 
  151          SHA_REGS->SHA_IODATAR[6] = 
p[22];
 
  152          SHA_REGS->SHA_IODATAR[7] = 
p[23];
 
  153          SHA_REGS->SHA_IODATAR[8] = 
p[24];
 
  154          SHA_REGS->SHA_IODATAR[9] = 
p[25];
 
  155          SHA_REGS->SHA_IODATAR[10] = 
p[26];
 
  156          SHA_REGS->SHA_IODATAR[11] = 
p[27];
 
  157          SHA_REGS->SHA_IODATAR[12] = 
p[28];
 
  158          SHA_REGS->SHA_IODATAR[13] = 
p[29];
 
  159          SHA_REGS->SHA_IODATAR[14] = 
p[30];
 
  160          SHA_REGS->SHA_IODATAR[15] = 
p[31];
 
  164       SHA_REGS->SHA_CR = SHA_CR_START_Msk;
 
  167       while((SHA_REGS->SHA_ISR & SHA_ISR_DATRDY_Msk) == 0)
 
  177    h[0] = SHA_REGS->SHA_IODATAR[0];
 
  178    h[1] = SHA_REGS->SHA_IODATAR[1];
 
  179    h[2] = SHA_REGS->SHA_IODATAR[2];
 
  180    h[3] = SHA_REGS->SHA_IODATAR[3];
 
  181    h[4] = SHA_REGS->SHA_IODATAR[4];
 
  184    if(algo == SHA_MR_ALGO_SHA256 || algo == SHA_MR_ALGO_SHA512)
 
  186       h[5] = SHA_REGS->SHA_IODATAR[5];
 
  187       h[6] = SHA_REGS->SHA_IODATAR[6];
 
  188       h[7] = SHA_REGS->SHA_IODATAR[7];
 
  192    if(algo == SHA_MR_ALGO_SHA512)
 
  194       h[8] = SHA_REGS->SHA_IODATAR[8];
 
  195       h[9] = SHA_REGS->SHA_IODATAR[9];
 
  196       h[10] = SHA_REGS->SHA_IODATAR[10];
 
  197       h[11] = SHA_REGS->SHA_IODATAR[11];
 
  198       h[12] = SHA_REGS->SHA_IODATAR[12];
 
  199       h[13] = SHA_REGS->SHA_IODATAR[13];
 
  200       h[14] = SHA_REGS->SHA_IODATAR[14];
 
  201       h[15] = SHA_REGS->SHA_IODATAR[15];
 
  209 #if (SHA1_SUPPORT == ENABLED) 
  219    context->
h[0] = 
BETOH32(0x67452301);
 
  220    context->
h[1] = 
BETOH32(0xEFCDAB89);
 
  221    context->
h[2] = 
BETOH32(0x98BADCFE);
 
  222    context->
h[3] = 
BETOH32(0x10325476);
 
  223    context->
h[4] = 
BETOH32(0xC3D2E1F0);
 
  279          if(context->
size == 64)
 
  309    if(context->
size < 56)
 
  311       paddingSize = 56 - context->
size;
 
  315       paddingSize = 64 + 56 - context->
size;
 
  322    for(i = 0; i < 8; i++)
 
  324       context->
buffer[63 - i] = totalSize & 0xFF;
 
  357 #if (SHA224_SUPPORT == ENABLED) 
  367    context->
h[0] = 
BETOH32(0xC1059ED8);
 
  368    context->
h[1] = 
BETOH32(0x367CD507);
 
  369    context->
h[2] = 
BETOH32(0x3070DD17);
 
  370    context->
h[3] = 
BETOH32(0xF70E5939);
 
  371    context->
h[4] = 
BETOH32(0xFFC00B31);
 
  372    context->
h[5] = 
BETOH32(0x68581511);
 
  373    context->
h[6] = 
BETOH32(0x64F98FA7);
 
  374    context->
h[7] = 
BETOH32(0xBEFA4FA4);
 
  383 #if (SHA256_SUPPORT == ENABLED) 
  393    context->
h[0] = 
BETOH32(0x6A09E667);
 
  394    context->
h[1] = 
BETOH32(0xBB67AE85);
 
  395    context->
h[2] = 
BETOH32(0x3C6EF372);
 
  396    context->
h[3] = 
BETOH32(0xA54FF53A);
 
  397    context->
h[4] = 
BETOH32(0x510E527F);
 
  398    context->
h[5] = 
BETOH32(0x9B05688C);
 
  399    context->
h[6] = 
BETOH32(0x1F83D9AB);
 
  400    context->
h[7] = 
BETOH32(0x5BE0CD19);
 
  456          if(context->
size == 64)
 
  486    if(context->
size < 56)
 
  488       paddingSize = 56 - context->
size;
 
  492       paddingSize = 64 + 56 - context->
size;
 
  499    for(i = 0; i < 8; i++)
 
  501       context->
buffer[63 - i] = totalSize & 0xFF;
 
  534 #if (SHA384_SUPPORT == ENABLED) 
  544    context->
h[0] = 
BETOH64(0xCBBB9D5DC1059ED8);
 
  545    context->
h[1] = 
BETOH64(0x629A292A367CD507);
 
  546    context->
h[2] = 
BETOH64(0x9159015A3070DD17);
 
  547    context->
h[3] = 
BETOH64(0x152FECD8F70E5939);
 
  548    context->
h[4] = 
BETOH64(0x67332667FFC00B31);
 
  549    context->
h[5] = 
BETOH64(0x8EB44A8768581511);
 
  550    context->
h[6] = 
BETOH64(0xDB0C2E0D64F98FA7);
 
  551    context->
h[7] = 
BETOH64(0x47B5481DBEFA4FA4);
 
  578 #if (SHA512_SUPPORT == ENABLED) 
  588    context->
h[0] = 
BETOH64(0x6A09E667F3BCC908);
 
  589    context->
h[1] = 
BETOH64(0xBB67AE8584CAA73B);
 
  590    context->
h[2] = 
BETOH64(0x3C6EF372FE94F82B);
 
  591    context->
h[3] = 
BETOH64(0xA54FF53A5F1D36F1);
 
  592    context->
h[4] = 
BETOH64(0x510E527FADE682D1);
 
  593    context->
h[5] = 
BETOH64(0x9B05688C2B3E6C1F);
 
  594    context->
h[6] = 
BETOH64(0x1F83D9ABFB41BD6B);
 
  595    context->
h[7] = 
BETOH64(0x5BE0CD19137E2179);
 
  651          if(context->
size == 128)
 
  655                (uint32_t *) context->
h);
 
  681    if(context->
size < 112)
 
  683       paddingSize = 112 - context->
size;
 
  687       paddingSize = 128 + 112 - context->
size;
 
  694    for(i = 0; i < 16; i++)
 
  696       context->
buffer[127 - i] = totalSize & 0xFF;
 
  702       (uint32_t *) context->
h);
 
  712 #if (SHA512_224_SUPPORT == ENABLED) 
  722    context->
h[0] = 
BETOH64(0x8C3D37C819544DA2);
 
  723    context->
h[1] = 
BETOH64(0x73E1996689DCD4D6);
 
  724    context->
h[2] = 
BETOH64(0x1DFAB7AE32FF9C82);
 
  725    context->
h[3] = 
BETOH64(0x679DD514582F9FCF);
 
  726    context->
h[4] = 
BETOH64(0x0F6D2B697BD44DA8);
 
  727    context->
h[5] = 
BETOH64(0x77E36F7304C48942);
 
  728    context->
h[6] = 
BETOH64(0x3F9D85A86A1D36C8);
 
  729    context->
h[7] = 
BETOH64(0x1112E6AD91D692A1);
 
  738 #if (SHA512_256_SUPPORT == ENABLED) 
  748    context->
h[0] = 
BETOH64(0x22312194FC2BF72C);
 
  749    context->
h[1] = 
BETOH64(0x9F555FA3C84C64C2);
 
  750    context->
h[2] = 
BETOH64(0x2393B86B6F53B151);
 
  751    context->
h[3] = 
BETOH64(0x963877195940EABD);
 
  752    context->
h[4] = 
BETOH64(0x96283EE2A88EFFE3);
 
  753    context->
h[5] = 
BETOH64(0xBE5E1E2553863992);
 
  754    context->
h[6] = 
BETOH64(0x2B0199FC2C85B8AA);
 
  755    context->
h[7] = 
BETOH64(0x0EB72DDC81C52CA2);