|
1 | 1 | package bdn
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "encoding" |
| 5 | + "encoding/hex" |
4 | 6 | "fmt"
|
5 | 7 | "testing"
|
6 | 8 |
|
@@ -158,3 +160,61 @@ func Benchmark_BDN_AggregateSigs(b *testing.B) {
|
158 | 160 | AggregateSignatures(suite, [][]byte{sig1, sig2}, mask)
|
159 | 161 | }
|
160 | 162 | }
|
| 163 | + |
| 164 | +func unmarshalHex[T encoding.BinaryUnmarshaler](t *testing.T, into T, s string) T { |
| 165 | + t.Helper() |
| 166 | + b, err := hex.DecodeString(s) |
| 167 | + require.NoError(t, err) |
| 168 | + require.NoError(t, into.UnmarshalBinary(b)) |
| 169 | + return into |
| 170 | +} |
| 171 | + |
| 172 | +// This tests exists to make sure we don't accidentally make breaking changes to signature |
| 173 | +// aggregation by using checking against known aggregated signatures and keys. |
| 174 | +func TestBDNFixtures(t *testing.T) { |
| 175 | + suite := bn256.NewSuite() |
| 176 | + schemeOnG1 := NewSchemeOnG1(suite) |
| 177 | + |
| 178 | + public1 := unmarshalHex(t, suite.G2().Point(), "1a30714035c7a161e286e54c191b8c68345bd8239c74925a26290e8e1ae97ed6657958a17dca12c943fadceb11b824402389ff427179e0f10194da3c1b771c6083797d2b5915ea78123cbdb99ea6389d6d6b67dcb512a2b552c373094ee5693524e3ebb4a176f7efa7285c25c80081d8cb598745978f1a63b886c09a316b1493") |
| 179 | + private1 := unmarshalHex(t, suite.G2().Scalar(), "49cfe5e9f4532670137184d43c0299f8b635bcacf6b0af7cab262494602d9f38") |
| 180 | + public2 := unmarshalHex(t, suite.G2().Point(), "603bc61466ec8762ec6de2ba9a80b9d302d08f580d1685ac45a8e404a6ed549719dc0faf94d896a9983ff23423772720e3de5d800bc200de6f7d7e146162d3183b8880c5c0d8b71ca4b3b40f30c12d8cc0679c81a47c239c6aa7e9cc2edab4a927fe865cd413c1c17e3df8f74108e784cd77dd3e161bdaf30019a55826a32a1f") |
| 181 | + private2 := unmarshalHex(t, suite.G2().Scalar(), "493abea4bb35b74c78ad9245f9d37883aeb6ee91f7fb0d8a8e11abf7aa2be581") |
| 182 | + public3 := unmarshalHex(t, suite.G2().Point(), "56118769a1f0b6286abacaa32109c1497ab0819c5d21f27317e184b6681c283007aa981cb4760de044946febdd6503ab77a4586bc29c04159e53a6fa5dcb9c0261ccd1cb2e28db5204ca829ac9f6be95f957a626544adc34ba3bc542533b6e2f5cbd0567e343641a61a42b63f26c3625f74b66f6f46d17b3bf1688fae4d455ec") |
| 183 | + private3 := unmarshalHex(t, suite.G2().Scalar(), "7fb0ebc317e161502208c3c16a4af890dedc3c7b275e8a04e99c0528aa6a19aa") |
| 184 | + |
| 185 | + sig1Exp, err := hex.DecodeString("0913b76987be19f943be23b636cab9a2484507717326bd8bbdcdbbb6b8d5eb9253cfb3597c3fa550ee4972a398813650825a871f8e0b242ae5ddbce1b7c0e2a8") |
| 186 | + require.NoError(t, err) |
| 187 | + sig2Exp, err := hex.DecodeString("21195d29b1863bca1559e24375211d1411d8a28a8f4c772870b07f4ccda2fd5e337c1315c210475c683e3aa8b87d3aed3f7255b3087daa30d1e1432dd61d7484") |
| 188 | + require.NoError(t, err) |
| 189 | + sig3Exp, err := hex.DecodeString("3c1ac80345c1733630dbdc8106925c867544b521c259f9fa9678d477e6e5d3d212b09bc0d95137c3dbc0af2241415156c56e757d5577a609293584d045593195") |
| 190 | + require.NoError(t, err) |
| 191 | + |
| 192 | + aggSigExp := unmarshalHex(t, suite.G1().Point(), "520875e6667e0acf489e458c6c2233d09af81afa3b2045e0ec2435cfc582ba2c44af281d688efcf991d20975ce32c9933a09f8c4b38c18ef4b4510d8fa0f09d7") |
| 193 | + aggKeyExp := unmarshalHex(t, suite.G2().Point(), "394d47291878a81fefb17708c57cf8078b24c46bf4554b3012732acd15395dbf09f13a65e068de766f5449d1de130f09bf09dc35a67f7f822f2a187230e155891d40db3c51afa5b3e05a039c50d04ff9c788718a2887e34644a55a14a2a2679226a3315c281e03367a4d797db819625e0c662d35e45e0e9e7604c104179ae8a7") |
| 194 | + |
| 195 | + msg := []byte("Hello many times Boneh-Lynn-Shacham") |
| 196 | + sig1, err := schemeOnG1.Sign(private1, msg) |
| 197 | + require.Nil(t, err) |
| 198 | + require.Equal(t, sig1Exp, sig1) |
| 199 | + |
| 200 | + sig2, err := schemeOnG1.Sign(private2, msg) |
| 201 | + require.Nil(t, err) |
| 202 | + require.Equal(t, sig2Exp, sig2) |
| 203 | + |
| 204 | + sig3, err := schemeOnG1.Sign(private3, msg) |
| 205 | + require.Nil(t, err) |
| 206 | + require.Equal(t, sig3Exp, sig3) |
| 207 | + |
| 208 | + mask, _ := sign.NewMask([]kyber.Point{public1, public2, public3}, nil) |
| 209 | + mask.SetBit(0, true) |
| 210 | + mask.SetBit(1, false) |
| 211 | + mask.SetBit(2, true) |
| 212 | + |
| 213 | + aggSig, err := schemeOnG1.AggregateSignatures([][]byte{sig1, sig2, sig3}, mask) |
| 214 | + require.NoError(t, err) |
| 215 | + require.True(t, aggSigExp.Equal(aggSig)) |
| 216 | + |
| 217 | + aggKey, err := schemeOnG1.AggregatePublicKeys(mask) |
| 218 | + require.NoError(t, err) |
| 219 | + require.True(t, aggKeyExp.Equal(aggKey)) |
| 220 | +} |
0 commit comments