btcec: add new IsCompressedPubKey function

This commit adds a new function to btcec: IsCompressedPubKey. This
function returns true iff the passed serialized public key is encoded
in compressed format.
This commit is contained in:
Olaoluwa Osuntokun 2017-04-26 16:21:40 -07:00 committed by Dave Collins
parent 9054ef8354
commit 65feec33e0
2 changed files with 21 additions and 0 deletions

View file

@ -54,6 +54,15 @@ const (
pubkeyHybrid byte = 0x6 // y_bit + x coord + y coord pubkeyHybrid byte = 0x6 // y_bit + x coord + y coord
) )
// IsCompressedPubKey returns true the the passed serialized public key has
// been encoded in compressed format, and false otherwise.
func IsCompressedPubKey(pubKey []byte) bool {
// The public key is only compressed if it is the correct length and
// the format (first byte) is one of the compressed pubkey values.
return len(pubKey) == PubKeyBytesLenCompressed &&
(pubKey[0]&^byte(0x1) == pubkeyCompressed)
}
// ParsePubKey parses a public key for a koblitz curve from a bytestring into a // ParsePubKey parses a public key for a koblitz curve from a bytestring into a
// ecdsa.Publickey, verifying that it is valid. It supports compressed, // ecdsa.Publickey, verifying that it is valid. It supports compressed,
// uncompressed and hybrid signature formats. // uncompressed and hybrid signature formats.

View file

@ -282,3 +282,15 @@ func TestPublicKeyIsEqual(t *testing.T) {
"equal to %v", pubKey1, pubKey2) "equal to %v", pubKey1, pubKey2)
} }
} }
func TestIsCompressed(t *testing.T) {
for _, test := range pubKeyTests {
isCompressed := IsCompressedPubKey(test.key)
wantCompressed := (test.format == pubkeyCompressed)
if isCompressed != wantCompressed {
t.Fatalf("%s (%x) pubkey: unexpected compressed result, "+
"got %v, want %v", test.name, test.key,
isCompressed, wantCompressed)
}
}
}