65 lines
1.9 KiB
Go
65 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/muun/libwallet"
|
|
"github.com/muun/libwallet/emergencykit"
|
|
)
|
|
|
|
var defaultNetwork = libwallet.Mainnet()
|
|
|
|
func decodeKeysFromInput(rawKey1 string, rawKey2 string) ([]*libwallet.EncryptedPrivateKeyInfo, error) {
|
|
key1, err := libwallet.DecodeEncryptedPrivateKey(rawKey1)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to decode first key: %w", err)
|
|
}
|
|
|
|
key2, err := libwallet.DecodeEncryptedPrivateKey(rawKey2)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to decode second key: %w", err)
|
|
}
|
|
|
|
return []*libwallet.EncryptedPrivateKeyInfo{key1, key2}, nil
|
|
}
|
|
|
|
func decodeKeysFromMetadata(meta *emergencykit.Metadata) ([]*libwallet.EncryptedPrivateKeyInfo, error) {
|
|
decodedKeys := make([]*libwallet.EncryptedPrivateKeyInfo, len(meta.EncryptedKeys))
|
|
|
|
for i, metaKey := range meta.EncryptedKeys {
|
|
decodedKeys[i] = &libwallet.EncryptedPrivateKeyInfo{
|
|
Version: meta.Version,
|
|
Birthday: meta.BirthdayBlock,
|
|
EphPublicKey: metaKey.DhPubKey,
|
|
CipherText: metaKey.EncryptedPrivKey,
|
|
Salt: metaKey.Salt,
|
|
}
|
|
}
|
|
|
|
return decodedKeys, nil
|
|
}
|
|
|
|
func decryptKeys(encryptedKeys []*libwallet.EncryptedPrivateKeyInfo, recoveryCode string) ([]*libwallet.DecryptedPrivateKey, error) {
|
|
// Always take the salt from the second key (the same salt was used for all keys, but our legacy
|
|
// key format did not include it in the first key):
|
|
salt := encryptedKeys[1].Salt
|
|
|
|
decryptionKey, err := libwallet.RecoveryCodeToKey(recoveryCode, salt)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to process recovery code: %w", err)
|
|
}
|
|
|
|
decryptedKeys := make([]*libwallet.DecryptedPrivateKey, len(encryptedKeys))
|
|
|
|
for i, encryptedKey := range encryptedKeys {
|
|
decryptedKey, err := decryptionKey.DecryptKey(encryptedKey, defaultNetwork)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to decrypt key %d: %w", i, err)
|
|
}
|
|
|
|
decryptedKeys[i] = decryptedKey
|
|
}
|
|
|
|
return decryptedKeys, nil
|
|
}
|