|
|
|
@ -982,12 +982,10 @@ func (s *Session) derive(path accounts.DerivationPath) (accounts.Account, error) |
|
|
|
|
copy(sig[32-len(rbytes):32], rbytes) |
|
|
|
|
copy(sig[64-len(sbytes):64], sbytes) |
|
|
|
|
|
|
|
|
|
pubkey, err := determinePublicKey(sig, sigdata.PublicKey) |
|
|
|
|
if err != nil { |
|
|
|
|
if err := confirmPublicKey(sig, sigdata.PublicKey); err != nil { |
|
|
|
|
return accounts.Account{}, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pub, err := crypto.UnmarshalPubkey(pubkey) |
|
|
|
|
pub, err := crypto.UnmarshalPubkey(sigdata.PublicKey) |
|
|
|
|
if err != nil { |
|
|
|
|
return accounts.Account{}, err |
|
|
|
|
} |
|
|
|
@ -1057,10 +1055,10 @@ func (s *Session) sign(path accounts.DerivationPath, hash []byte) ([]byte, error |
|
|
|
|
return sig, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// determinePublicKey uses a signature and the X component of a public key to
|
|
|
|
|
// recover the entire public key.
|
|
|
|
|
func determinePublicKey(sig, pubkeyX []byte) ([]byte, error) { |
|
|
|
|
return makeRecoverableSignature(DerivationSignatureHash[:], sig, pubkeyX) |
|
|
|
|
// confirmPublicKey confirms that the given signature belongs to the specified key.
|
|
|
|
|
func confirmPublicKey(sig, pubkey []byte) error { |
|
|
|
|
_, err := makeRecoverableSignature(DerivationSignatureHash[:], sig, pubkey) |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// makeRecoverableSignature uses a signature and an expected public key to
|
|
|
|
|