Release v0.3.0

This commit is contained in:
Manu Herrera
2020-11-09 10:05:29 -03:00
parent 4e9aa7a3c5
commit 8107c4478b
1265 changed files with 440488 additions and 107809 deletions

View File

@@ -2,8 +2,6 @@ package libwallet
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/binary"
"github.com/btcsuite/btcd/btcec"
@@ -28,10 +26,10 @@ func NewChallengePublicKeyFromSerialized(serializedKey []byte) (*ChallengePublic
func (k *ChallengePublicKey) EncryptKey(privKey *HDPrivateKey, recoveryCodeSalt []byte, birthday int) (string, error) {
const (
chainCodeStart = 13
chainCodeStart = 13
chainCodeLength = 32
privKeyStart = 46
privKeyLength = 32
privKeyStart = 46
privKeyLength = 32
)
rawHDKey := base58.Decode(privKey.String())
@@ -42,35 +40,26 @@ func (k *ChallengePublicKey) EncryptKey(privKey *HDPrivateKey, recoveryCodeSalt
return "", errors.Errorf("failed to encrypt key: expected payload of 64 bytes, found %v", len(plaintext))
}
privEph, err := btcec.NewPrivateKey(btcec.S256())
pubEph, ciphertext, err := encryptWithPubKey(k.pubKey, plaintext)
if err != nil {
return "", errors.Wrapf(err, "failed to encrypt key")
return "", err
}
sharedSecret, _ := k.pubKey.ScalarMult(k.pubKey.X, k.pubKey.Y, privEph.D.Bytes())
serializedPubkey := privEph.PubKey().SerializeCompressed()
iv := serializedPubkey[len(serializedPubkey)-aes.BlockSize:]
block, err := aes.NewCipher(paddedSerializeBigInt(32, sharedSecret))
if err != nil {
return "", errors.Wrapf(err, "challenge_public_key: failed to generate encryption key")
}
ciphertext := make([]byte, len(plaintext))
mode := cipher.NewCBCEncrypter(block, iv)
mode.CryptBlocks(ciphertext, plaintext)
birthdayBytes := make([]byte, 2)
binary.BigEndian.PutUint16(birthdayBytes, uint16(birthday))
result := make([]byte, 0, 1+2+33+len(ciphertext)+len(recoveryCodeSalt))
if len(recoveryCodeSalt) == 0 {
// Fill the salt with zeros to maintain the encrypted keys format
recoveryCodeSalt = make([]byte, 8)
}
result := make([]byte, 0, 1+2+serializedPublicKeyLength+len(ciphertext)+len(recoveryCodeSalt))
buf := bytes.NewBuffer(result)
buf.WriteByte(2)
buf.Write(birthdayBytes)
buf.Write(privEph.PubKey().SerializeCompressed())
buf.Write(pubEph.SerializeCompressed())
buf.Write(ciphertext)
buf.Write(recoveryCodeSalt)
return base58.Encode(buf.Bytes()), nil
}
}