Add padding for pubkey numbers.
This change pads serialized (big endian) pubkey numbers to a length of 32 bytes. Previously, because serialized pubkey numbers are read MSB-first, if a number could be serialized in less than 31 bytes, the deserialized number would be incorrect.
This commit is contained in:
parent
98ac46b37d
commit
506c3eacac
1 changed files with 16 additions and 5 deletions
21
pubkey.go
21
pubkey.go
|
@ -98,8 +98,8 @@ type PublicKey ecdsa.PublicKey
|
||||||
func (p *PublicKey) SerializeUncompressed() []byte {
|
func (p *PublicKey) SerializeUncompressed() []byte {
|
||||||
b := make([]byte, 65)
|
b := make([]byte, 65)
|
||||||
b[0] = pubkeyUncompressed
|
b[0] = pubkeyUncompressed
|
||||||
copy(b[1:33], p.X.Bytes())
|
copy(b[1:33], pad(32, p.X.Bytes()))
|
||||||
copy(b[33:], p.Y.Bytes())
|
copy(b[33:], pad(32, p.Y.Bytes()))
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ func (p *PublicKey) SerializeCompressed() []byte {
|
||||||
format |= 0x1
|
format |= 0x1
|
||||||
}
|
}
|
||||||
b[0] = format
|
b[0] = format
|
||||||
copy(b[1:33], p.X.Bytes())
|
copy(b[1:33], pad(32, p.X.Bytes()))
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,7 +123,18 @@ func (p *PublicKey) SerializeHybrid() []byte {
|
||||||
format |= 0x1
|
format |= 0x1
|
||||||
}
|
}
|
||||||
b[0] = format
|
b[0] = format
|
||||||
copy(b[1:33], p.X.Bytes())
|
copy(b[1:33], pad(32, p.X.Bytes()))
|
||||||
copy(b[33:], p.Y.Bytes())
|
copy(b[33:], pad(32, p.Y.Bytes()))
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func pad(size int, b []byte) []byte {
|
||||||
|
// Prevent a possible panic if the input exceeds the expected size.
|
||||||
|
if len(b) > size {
|
||||||
|
size = len(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
p := make([]byte, size)
|
||||||
|
copy(p[size-len(b):], b)
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue