void HPAVKeyNMK (uint8_t NMK [], const char * string) { struct sha256 sha256; uint8_t digest [SHA256_DIGEST_LENGTH]; const uint8_t secret [] = { 0x08, 0x85, 0x6D, 0xAF, 0x7C, 0xF5, 0x81, 0x86 }; unsigned rehash = 999; SHA256Reset (&sha256); SHA256Write (&sha256, string, strlen (string)); SHA256Write (&sha256, secret, sizeof (secret)); SHA256Fetch (&sha256, digest); while (rehash--) { SHA256Reset (&sha256); SHA256Write (&sha256, digest, sizeof (digest)); SHA256Fetch (&sha256, digest); } memcpy (NMK, digest, HPAVKEY_NMK_LEN); return; }
void HPAVKeyNID (uint8_t NID [], const uint8_t NMK [], uint8_t level) { struct sha256 sha256; uint8_t digest [SHA256_DIGEST_LENGTH]; unsigned rehash = 4; SHA256Reset (&sha256); SHA256Write (&sha256, NMK, HPAVKEY_NMK_LEN); SHA256Fetch (&sha256, digest); while (rehash--) { SHA256Reset (&sha256); SHA256Write (&sha256, digest, sizeof (digest)); SHA256Fetch (&sha256, digest); } #if 1 level <<= 4; digest [HPAVKEY_NID_LEN - 1] >>= 4; digest [HPAVKEY_NID_LEN - 1] |= level; #else digest [HPAVKEY_NID_LEN - 1] &= ~0xC0; digest [HPAVKEY_NID_LEN - 1] |= level << 6; #endif memcpy (NID, digest, HPAVKEY_NID_LEN); return; }
void HPAVKeyDAK (uint8_t DAK [], const char * string) { struct sha256 sha256; uint8_t digest [SHA256_DIGEST_LENGTH]; const uint8_t secret [] = { 0x08, 0x85, 0x6D, 0xAF, 0x7C, 0xF5, 0x81, 0x85 }; int count = 999; SHA256Reset (&sha256); SHA256Write (&sha256, (uint8_t *)(string), strlen (string)); SHA256Write (&sha256, secret, sizeof (secret)); SHA256Fetch (&sha256, digest); while (count-- > 0) { SHA256Reset (&sha256); SHA256Write (&sha256, digest, sizeof (digest)); SHA256Fetch (&sha256, digest); } memcpy (DAK, digest, HPAVKEY_DAK_LEN); return; }
void HPAVKeyNID (uint8_t NID [], const uint8_t NMK [], uint8_t level) { struct sha256 sha256; uint8_t digest [SHA256_DIGEST_LENGTH]; int count = 4; SHA256Reset (&sha256); SHA256Write (&sha256, NMK, HPAVKEY_NMK_LEN); SHA256Fetch (&sha256, digest); while (count-- > 0) { SHA256Reset (&sha256); SHA256Write (&sha256, digest, sizeof (digest)); SHA256Fetch (&sha256, digest); } level <<= 4; digest [HPAVKEY_NID_LEN - 1] >>= 4; digest [HPAVKEY_NID_LEN - 1] |= level; memcpy (NID, digest, HPAVKEY_NID_LEN); return; }
void SHA256Ident (signed fd, uint8_t digest []) { struct sha256 sha256; uint8_t buffer [1024]; signed length; SHA256Reset (&sha256); while ((length = read (fd, buffer, sizeof (buffer))) > 0) { SHA256Write (&sha256, buffer, length); } SHA256Fetch (&sha256, digest); return; }