Exemple #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;
}
Exemple #2
0
CBHDKey * CBNewHDKeyFromData(uint8_t * data){
	CBHDKeyVersion versionBytes = CBArrayToInt32BigEndian(data, 0);
	CBHDKeyType type = CBHDKeyGetType(versionBytes);
	if (type == CB_HD_KEY_TYPE_UNKNOWN) {
		CBLogError("Unknown key type.");
		return NULL;
	}
	// Allocate memory for key
	CBHDKey * key = CBNewHDKey(type == CB_HD_KEY_TYPE_PRIVATE);
	return CBInitHDKeyFromData(key, data, versionBytes, type) ? key : NULL;
}