NidNmk.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #include "NidNmk.h"
  2. void HPAVKeyNMK (uint8_t NMK [], const char * string)
  3. {
  4. struct sha256 sha256;
  5. uint8_t digest [SHA256_DIGEST_LENGTH];
  6. const uint8_t secret [] =
  7. {
  8. 0x08,
  9. 0x85,
  10. 0x6D,
  11. 0xAF,
  12. 0x7C,
  13. 0xF5,
  14. 0x81,
  15. 0x86
  16. };
  17. unsigned rehash = 999;
  18. SHA256Reset (&sha256);
  19. SHA256Write (&sha256, string, strlen (string));
  20. SHA256Write (&sha256, secret, sizeof (secret));
  21. SHA256Fetch (&sha256, digest);
  22. while (rehash--)
  23. {
  24. SHA256Reset (&sha256);
  25. SHA256Write (&sha256, digest, sizeof (digest));
  26. SHA256Fetch (&sha256, digest);
  27. }
  28. memcpy (NMK, digest, HPAVKEY_NMK_LEN);
  29. return;
  30. }
  31. void HPAVKeyNID (uint8_t NID[], const uint8_t NMK[], uint8_t level)
  32. {
  33. struct sha256 sha256;
  34. uint8_t digest [SHA256_DIGEST_LENGTH];
  35. unsigned int rehash = 4;
  36. SHA256Reset (&sha256);
  37. SHA256Write (&sha256, NMK, HPAVKEY_NMK_LEN);
  38. SHA256Fetch (&sha256, digest);
  39. while (rehash--)
  40. {
  41. SHA256Reset (&sha256);
  42. SHA256Write (&sha256, digest, sizeof (digest));
  43. SHA256Fetch (&sha256, digest);
  44. }
  45. #if 1
  46. level <<= 4;
  47. digest [HPAVKEY_NID_LEN - 1] >>= 4;
  48. digest [HPAVKEY_NID_LEN - 1] |= level;
  49. #else
  50. digest [HPAVKEY_NID_LEN - 1] &= ~0xC0;
  51. digest [HPAVKEY_NID_LEN - 1] |= level << 6;
  52. #endif
  53. memcpy (NID, digest, HPAVKEY_NID_LEN);
  54. return;
  55. }
  56. void SHA256Reset (struct sha256 *sha256)
  57. {
  58. memset (sha256, 0, sizeof (struct sha256));
  59. sha256->state [0] = 0x6A09E667;
  60. sha256->state [1] = 0xBB67AE85;
  61. sha256->state [2] = 0x3C6EF372;
  62. sha256->state [3] = 0xA54FF53A;
  63. sha256->state [4] = 0x510E527F;
  64. sha256->state [5] = 0x9B05688C;
  65. sha256->state [6] = 0x1F83D9AB;
  66. sha256->state [7] = 0x5BE0CD19;
  67. sha256->extra [0] = 0x80;
  68. return;
  69. }
  70. void SHA256Block (struct sha256 *sha256, void const *memory)
  71. {
  72. static const uint32_t K [sizeof (sha256->block)] =
  73. {
  74. 0x428A2F98,
  75. 0x71374491,
  76. 0xB5C0FBCF,
  77. 0xE9B5DBA5,
  78. 0x3956C25B,
  79. 0x59F111F1,
  80. 0x923F82A4,
  81. 0xAB1C5ED5,
  82. 0xD807AA98,
  83. 0x12835B01,
  84. 0x243185BE,
  85. 0x550C7DC3,
  86. 0x72BE5D74,
  87. 0x80DEB1FE,
  88. 0x9BDC06A7,
  89. 0xC19BF174,
  90. 0xE49B69C1,
  91. 0xEFBE4786,
  92. 0x0FC19DC6,
  93. 0x240CA1CC,
  94. 0x2DE92C6F,
  95. 0x4A7484AA,
  96. 0x5CB0A9DC,
  97. 0x76F988DA,
  98. 0x983E5152,
  99. 0xA831C66D,
  100. 0xB00327C8,
  101. 0xBF597FC7,
  102. 0xC6E00BF3,
  103. 0xD5A79147,
  104. 0x06CA6351,
  105. 0x14292967,
  106. 0x27B70A85,
  107. 0x2E1B2138,
  108. 0x4D2C6DFC,
  109. 0x53380D13,
  110. 0x650A7354,
  111. 0x766A0ABB,
  112. 0x81C2C92E,
  113. 0x92722C85,
  114. 0xA2BFE8A1,
  115. 0xA81A664B,
  116. 0xC24B8B70,
  117. 0xC76C51A3,
  118. 0xD192E819,
  119. 0xD6990624,
  120. 0xF40E3585,
  121. 0x106AA070,
  122. 0x19A4C116,
  123. 0x1E376C08,
  124. 0x2748774C,
  125. 0x34B0BCB5,
  126. 0x391C0CB3,
  127. 0x4ED8AA4A,
  128. 0x5B9CCA4F,
  129. 0x682E6FF3,
  130. 0x748F82EE,
  131. 0x78A5636F,
  132. 0x84C87814,
  133. 0x8CC70208,
  134. 0x90BEFFFA,
  135. 0xA4506CEB,
  136. 0xBEF9A3F7,
  137. 0xC67178F2
  138. };
  139. unsigned int pass;
  140. unsigned int word;
  141. uint32_t H [sizeof (sha256->state)/sizeof (uint32_t)];
  142. uint32_t W [sizeof (sha256->block)];
  143. uint8_t * buffer = (uint8_t *)(memory);
  144. for (word = 0; word < 16; word++)
  145. {
  146. W [word] = 0;
  147. W [word] |= (uint32_t)(*buffer++) << 24;
  148. W [word] |= (uint32_t)(*buffer++) << 16;
  149. W [word] |= (uint32_t)(*buffer++) << 8;
  150. W [word] |= (uint32_t)(*buffer++) << 0;;
  151. }
  152. for (word = word; word < sizeof (sha256->block); word++)
  153. {
  154. uint32_t s0 = ROTR (W [word-15], 7) ^ ROTR (W [word-15], 18) ^ SHR (W [word-15], 3);
  155. uint32_t s1 = ROTR (W [word- 2], 17) ^ ROTR (W [word- 2], 19) ^ SHR (W [word- 2], 10);
  156. W [word] = W [word - 16] + s0 + W [word - 7] + s1;
  157. }
  158. for (word = 0; word < (sizeof (sha256->state) / sizeof (uint32_t)); word++)
  159. {
  160. H [word] = sha256->state [word];
  161. }
  162. for (pass = 0; pass < sizeof (sha256->block); pass++)
  163. {
  164. uint32_t s2 = ROTR (H [0], 2) ^ ROTR (H [0], 13) ^ ROTR (H [0], 22);
  165. uint32_t maj = (H [0] & H [1]) ^ (H [0] & H [2]) ^ (H [1] & H [2]);
  166. uint32_t t2 = s2 + maj;
  167. uint32_t s3 = ROTR (H [4], 6) ^ ROTR (H [4], 11) ^ ROTR (H [4], 25);
  168. uint32_t ch = (H [4] & H [5]) ^ ((~ H [4]) & H [6]);
  169. uint32_t t1 = H [7] + s3 + ch + K [pass] + W [pass];
  170. for (word = (sizeof (sha256->state) / sizeof (uint32_t)) - 1; word > 0; word--)
  171. {
  172. H [word] = H [word-1];
  173. }
  174. H [0] = t1 + t2;
  175. H [4] += t1;
  176. }
  177. for (word = 0; word < (sizeof (sha256->state) / sizeof (uint32_t)); word++)
  178. {
  179. sha256->state [word] += H [word];
  180. }
  181. return;
  182. }
  183. void SHA256Write (struct sha256 *sha256, void const *memory, uint16_t extent)
  184. {
  185. if (extent)
  186. {
  187. uint8_t * buffer = (uint8_t *)(memory);
  188. unsigned int left = sha256->count [0] & 0x3F;
  189. unsigned int fill = sizeof (sha256->block) - left;
  190. sha256->count [0] += (uint32_t)(extent);
  191. sha256->count [0] &= 0xFFFFFFFF;
  192. if (sha256->count [0] < extent)
  193. {
  194. sha256->count [1]++;
  195. }
  196. if ((left) && (extent >= fill))
  197. {
  198. memcpy (sha256->block + left, buffer, fill);
  199. SHA256Block (sha256, sha256->block);
  200. extent -= fill;
  201. buffer += fill;
  202. left = 0;
  203. }
  204. while (extent >= sizeof (sha256->block))
  205. {
  206. SHA256Block (sha256, buffer);
  207. extent -= sizeof (sha256->block);
  208. buffer += sizeof (sha256->block);
  209. }
  210. if (extent)
  211. {
  212. memcpy (sha256->block + left, buffer, extent);
  213. }
  214. }
  215. return;
  216. }
  217. void SHAEncode(uint8_t memory[], uint32_t number)
  218. {
  219. *memory++ = (uint8_t)(number >> 24);
  220. *memory++ = (uint8_t)(number >> 16);
  221. *memory++ = (uint8_t)(number >> 8);
  222. *memory++ = (uint8_t)(number >> 0);
  223. return;
  224. }
  225. void SHA256Fetch (struct sha256 *sha256, uint8_t digest[])
  226. {
  227. unsigned int word;
  228. uint8_t bits [8];
  229. uint32_t upper = (sha256->count [0] >> 29) | (sha256->count [1] << 3);
  230. uint32_t lower = (sha256->count [0] << 3);
  231. uint32_t final = (sha256->count [0] & 0x3F);
  232. uint32_t extra = (final < 56)? (56 - final): (120 - final);
  233. SHAEncode(&bits[0], upper);
  234. SHAEncode(&bits[4], lower);
  235. SHA256Write (sha256, sha256->extra, extra);
  236. SHA256Write (sha256, bits, sizeof (bits));
  237. for (word = 0; word < sizeof (sha256->state) / sizeof (uint32_t); word++)
  238. {
  239. SHAEncode (digest, sha256->state [word]);
  240. digest += sizeof (uint32_t);
  241. }
  242. memset (sha256, 0, sizeof (struct sha256));
  243. return;
  244. }