Esempio n. 1
0
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;
}
Esempio n. 2
0
CBHDKey * CBNewHDKey(bool priv){
	CBHDKey * key = malloc(sizeof(*key) + (priv ? sizeof(CBKeyPair) : sizeof(CBPubKeyInfo)));
	CBInitHDKey(key);
	return key;
}