diff --git a/packages/binary/valuetransfer/address/signaturescheme/bls.go b/packages/binary/valuetransfer/address/signaturescheme/bls.go index b20d3273933d17a7ea1a41c1f77892bd4deb3335..5f77819e79a96eef89f45b673344fd1b64be566e 100644 --- a/packages/binary/valuetransfer/address/signaturescheme/bls.go +++ b/packages/binary/valuetransfer/address/signaturescheme/bls.go @@ -23,9 +23,10 @@ import ( var suite = bn256.NewSuite() const ( - BLS_SIGNATURE_SIZE = 64 - BLS_PUBLIC_KEY_SIZE = 128 - BLS_PRIVATE_KEY_SIZE = 32 + BLS_SIGNATURE_SIZE = 64 + BLS_PUBLIC_KEY_SIZE = 128 + BLS_PRIVATE_KEY_SIZE = 32 + BLS_FULL_SIGNATURE_SIZE = 1 + BLS_PUBLIC_KEY_SIZE + BLS_SIGNATURE_SIZE ) // ---------------- implements SignatureScheme interface @@ -110,7 +111,23 @@ var _ SignatureScheme = &blsSignatureScheme{} // ---------------- 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 { var ret blsSignature diff --git a/packages/binary/valuetransfer/transaction/signatures.go b/packages/binary/valuetransfer/transaction/signatures.go index ca2faf3fb70b295fb17e49189b76b5272085d99a..843389e3cb50b025fe7895de56a1258e004bcb52 100644 --- a/packages/binary/valuetransfer/transaction/signatures.go +++ b/packages/binary/valuetransfer/transaction/signatures.go @@ -44,7 +44,9 @@ func SignaturesFromBytes(bytes []byte, optionalTargetObject ...*Signatures) (res } // 0 byte encodes the end of the signatures + var typeCastedSignature signaturescheme.Signature for versionByte != 0 { + typeCastedSignature = nil // perform signature scheme specific decoding switch versionByte { case address.VERSION_ED25519: @@ -55,8 +57,21 @@ func SignaturesFromBytes(bytes []byte, optionalTargetObject ...*Signatures) (res 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) } diff --git a/packages/binary/valuetransfer/transaction/signatures_test.go b/packages/binary/valuetransfer/transaction/signatures_test.go index 88589852620a60aef23c75b1e89a150c75f08ac3..a27426c1b16b22d03f41db1caa1b9dc94ab09111 100644 --- a/packages/binary/valuetransfer/transaction/signatures_test.go +++ b/packages/binary/valuetransfer/transaction/signatures_test.go @@ -15,16 +15,18 @@ func TestSignatures(t *testing.T) { address1SigScheme := signaturescheme.ED25519(ed25119.GenerateKeyPair()) address2SigScheme := signaturescheme.ED25519(ed25119.GenerateKeyPair()) + address3SigScheme := signaturescheme.RandBLS() signatures := NewSignatures() signatures.Add(address1SigScheme.Address(), address1SigScheme.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)) - assert.Equal(t, 2, signatures.Size()) + assert.Equal(t, 3, signatures.Size()) signatures.ForEach(func(address address.Address, signature signaturescheme.Signature) bool { assert.Equal(t, true, signature.IsValid(dataToSign)) @@ -39,7 +41,7 @@ func TestSignatures(t *testing.T) { return } - assert.Equal(t, 2, clonedSignatures.Size()) + assert.Equal(t, 3, clonedSignatures.Size()) clonedSignatures.ForEach(func(address address.Address, signature signaturescheme.Signature) bool { assert.Equal(t, true, signature.IsValid(dataToSign))