// validateAndDecryptSeriesKeys checks that the length of the public and private key // slices is the same, decrypts them, ensures the non-nil private keys have a matching // public key and returns them. // // This function must be called with the Pool's manager unlocked. func validateAndDecryptKeys(rawPubKeys, rawPrivKeys [][]byte, p *Pool) (pubKeys, privKeys []*hdkeychain.ExtendedKey, err error) { pubKeys = make([]*hdkeychain.ExtendedKey, len(rawPubKeys)) privKeys = make([]*hdkeychain.ExtendedKey, len(rawPrivKeys)) if len(pubKeys) != len(privKeys) { return nil, nil, newError(ErrKeysPrivatePublicMismatch, "the pub key and priv key arrays should have the same number of elements", nil) } for i, encryptedPub := range rawPubKeys { pubKey, err := p.decryptExtendedKey(waddrmgr.CKTPublic, encryptedPub) if err != nil { return nil, nil, err } pubKeys[i] = pubKey encryptedPriv := rawPrivKeys[i] var privKey *hdkeychain.ExtendedKey if encryptedPriv == nil { privKey = nil } else { privKey, err = p.decryptExtendedKey(waddrmgr.CKTPrivate, encryptedPriv) if err != nil { return nil, nil, err } } privKeys[i] = privKey if privKey != nil { checkPubKey, err := privKey.Neuter() if err != nil { str := fmt.Sprintf("cannot neuter key %v", privKey) return nil, nil, newError(ErrKeyNeuter, str, err) } if pubKey.String() != checkPubKey.String() { str := fmt.Sprintf("public key %v different than expected %v", pubKey, checkPubKey) return nil, nil, newError(ErrKeyMismatch, str, nil) } } } return pubKeys, privKeys, nil }