/*====================================================================* * * Copyright (c) 2013 Qualcomm Atheros, Inc. * * All rights reserved. * *====================================================================*/ /*====================================================================* * * void HPAVKeyNMK (uint8_t NMK [], const char * string); * * HPAVKey.h * * compute the HomePlugAV compliant Network Membership Key (NMK) * for a NUL terminated string; return the key in buffer NMK []; * the key will be HPAVKEY_NMK_LEN bytes as defined in HPAVKey.h; * * seed the digest then salt the digest then rehash the digest 999 * times per HomePlug AV Specification; * * * Contributor(s); * Charles Maier <cmaier@qca.qualcomm.com> * *--------------------------------------------------------------------*/ #ifndef HPAVKEYNMK_SOURCE #define HPAVKEYNMK_SOURCE #include <memory.h> #include "../key/HPAVKey.h" #include "../key/SHA256.h" 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; } #endif