bool CBInitHDKeyFromData(CBHDKey * key, uint8_t * data, CBHDKeyVersion versionBytes, CBHDKeyType type){ CBInitHDKey(key); // Set version bytes key->versionBytes = versionBytes; // Chain code memcpy(key->chainCode, data + 13, 32); if (type == CB_HD_KEY_TYPE_PRIVATE){ // Private memcpy(key->keyPair->privkey, data + 46, 32); // Calculate public key CBKeyGetPublicKey(CBHDKeyGetPrivateKey(key), CBHDKeyGetPublicKey(key)); }else // Assume public memcpy(CBHDKeyGetPublicKey(key), data + 45, 33); // Depth key->depth = data[4]; if (key->depth == 0) { // Master key->childID.priv = false; key->childID.childNumber = 0; for (uint8_t x = 5; x < 9; x++) if (data[x] != 0) { CBLogError("The fingerprint of the master key is not zero."); return false; } }else{ // Not master uint32_t childNum = CBArrayToInt32BigEndian(data, 9); key->childID.priv = childNum >> 31; key->childID.childNumber = childNum & 0x8fffffff; } return true; }
CBHDKey * CBNewHDKey(bool priv){ CBHDKey * key = malloc(sizeof(*key) + (priv ? sizeof(CBKeyPair) : sizeof(CBPubKeyInfo))); CBInitHDKey(key); return key; }