Skip to content
Snippets Groups Projects
Commit 0b154951 authored by lunfardo314's avatar lunfardo314
Browse files

added BLS signatures and addresses + tests

parent 864405f8
No related branches found
No related tags found
No related merge requests found
...@@ -23,9 +23,10 @@ import ( ...@@ -23,9 +23,10 @@ import (
var suite = bn256.NewSuite() var suite = bn256.NewSuite()
const ( const (
BLS_SIGNATURE_SIZE = 64 BLS_SIGNATURE_SIZE = 64
BLS_PUBLIC_KEY_SIZE = 128 BLS_PUBLIC_KEY_SIZE = 128
BLS_PRIVATE_KEY_SIZE = 32 BLS_PRIVATE_KEY_SIZE = 32
BLS_FULL_SIGNATURE_SIZE = 1 + BLS_PUBLIC_KEY_SIZE + BLS_SIGNATURE_SIZE
) )
// ---------------- implements SignatureScheme interface // ---------------- implements SignatureScheme interface
...@@ -110,7 +111,23 @@ var _ SignatureScheme = &blsSignatureScheme{} ...@@ -110,7 +111,23 @@ var _ SignatureScheme = &blsSignatureScheme{}
// ---------------- implements Signature interface // ---------------- implements Signature interface
type blsSignature [1 + BLS_PUBLIC_KEY_SIZE + BLS_SIGNATURE_SIZE]byte type blsSignature [BLS_FULL_SIGNATURE_SIZE]byte
func BLSSignatureFromBytes(data []byte) (result *blsSignature, err error, consumedBytes int) {
consumedBytes = 0
err = nil
if len(data) < BLS_FULL_SIGNATURE_SIZE {
err = fmt.Errorf("marshalled BLS signature size must be %d", BLS_FULL_SIGNATURE_SIZE)
return
}
if data[0] != address.VERSION_BLS {
err = fmt.Errorf("wrong version byte, expected %d", address.VERSION_BLS)
}
result = &blsSignature{}
copy(result[:BLS_FULL_SIGNATURE_SIZE], data)
consumedBytes = BLS_FULL_SIGNATURE_SIZE
return
}
func newBLSSignature(pubKey, signature []byte) *blsSignature { func newBLSSignature(pubKey, signature []byte) *blsSignature {
var ret blsSignature var ret blsSignature
......
...@@ -44,7 +44,9 @@ func SignaturesFromBytes(bytes []byte, optionalTargetObject ...*Signatures) (res ...@@ -44,7 +44,9 @@ func SignaturesFromBytes(bytes []byte, optionalTargetObject ...*Signatures) (res
} }
// 0 byte encodes the end of the signatures // 0 byte encodes the end of the signatures
var typeCastedSignature signaturescheme.Signature
for versionByte != 0 { for versionByte != 0 {
typeCastedSignature = nil
// perform signature scheme specific decoding // perform signature scheme specific decoding
switch versionByte { switch versionByte {
case address.VERSION_ED25519: case address.VERSION_ED25519:
...@@ -55,8 +57,21 @@ func SignaturesFromBytes(bytes []byte, optionalTargetObject ...*Signatures) (res ...@@ -55,8 +57,21 @@ func SignaturesFromBytes(bytes []byte, optionalTargetObject ...*Signatures) (res
return return
} }
typeCastedSignature := signature.(signaturescheme.Signature) typeCastedSignature = signature.(signaturescheme.Signature)
case address.VERSION_BLS:
marshalUtil.ReadSeek(-1)
signature, signatureErr := marshalUtil.Parse(func(data []byte) (interface{}, error, int) { return signaturescheme.BLSSignatureFromBytes(data) })
if signatureErr != nil {
err = signatureErr
return
}
typeCastedSignature = signature.(signaturescheme.Signature)
default:
// unknown signature type...
}
if typeCastedSignature != nil {
result.orderedMap.Set(typeCastedSignature.Address(), typeCastedSignature) result.orderedMap.Set(typeCastedSignature.Address(), typeCastedSignature)
} }
......
...@@ -15,16 +15,18 @@ func TestSignatures(t *testing.T) { ...@@ -15,16 +15,18 @@ func TestSignatures(t *testing.T) {
address1SigScheme := signaturescheme.ED25519(ed25119.GenerateKeyPair()) address1SigScheme := signaturescheme.ED25519(ed25119.GenerateKeyPair())
address2SigScheme := signaturescheme.ED25519(ed25119.GenerateKeyPair()) address2SigScheme := signaturescheme.ED25519(ed25119.GenerateKeyPair())
address3SigScheme := signaturescheme.RandBLS()
signatures := NewSignatures() signatures := NewSignatures()
signatures.Add(address1SigScheme.Address(), address1SigScheme.Sign(dataToSign)) signatures.Add(address1SigScheme.Address(), address1SigScheme.Sign(dataToSign))
signatures.Add(address2SigScheme.Address(), address2SigScheme.Sign(dataToSign)) signatures.Add(address2SigScheme.Address(), address2SigScheme.Sign(dataToSign))
signatures.Add(address3SigScheme.Address(), address3SigScheme.Sign(dataToSign))
assert.Equal(t, 2, signatures.Size()) assert.Equal(t, 3, signatures.Size())
signatures.Add(address1SigScheme.Address(), address1SigScheme.Sign(dataToSign)) signatures.Add(address1SigScheme.Address(), address1SigScheme.Sign(dataToSign))
assert.Equal(t, 2, signatures.Size()) assert.Equal(t, 3, signatures.Size())
signatures.ForEach(func(address address.Address, signature signaturescheme.Signature) bool { signatures.ForEach(func(address address.Address, signature signaturescheme.Signature) bool {
assert.Equal(t, true, signature.IsValid(dataToSign)) assert.Equal(t, true, signature.IsValid(dataToSign))
...@@ -39,7 +41,7 @@ func TestSignatures(t *testing.T) { ...@@ -39,7 +41,7 @@ func TestSignatures(t *testing.T) {
return return
} }
assert.Equal(t, 2, clonedSignatures.Size()) assert.Equal(t, 3, clonedSignatures.Size())
clonedSignatures.ForEach(func(address address.Address, signature signaturescheme.Signature) bool { clonedSignatures.ForEach(func(address address.Address, signature signaturescheme.Signature) bool {
assert.Equal(t, true, signature.IsValid(dataToSign)) assert.Equal(t, true, signature.IsValid(dataToSign))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment