Skip to content

Commit 4dc6646

Browse files
committed
POP sign and prove modes
1 parent d7540b1 commit 4dc6646

File tree

4 files changed

+76
-33
lines changed

4 files changed

+76
-33
lines changed

blst.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -455,29 +455,29 @@ func (p *P1) AddOrDoubleAffine(other *P1Affine) {
455455
C.blst_p1_add_or_double_affine((*p1)(p), (*p1)(p), (*p1Affine)(other))
456456
}
457457

458-
func HashToP1(digest, suite, aug []byte) *P1 {
458+
func HashToP1(msg, suite, aug []byte) *P1 {
459459
var (
460460
q p1
461461
a *byte
462462
)
463463
if len(aug) != 0 {
464464
a = &aug[0]
465465
}
466-
C.blst_hash_to_g1(&q, (*C.uint8_t)(&digest[0]), C.size_t(len(digest)),
466+
C.blst_hash_to_g1(&q, (*C.uint8_t)(&msg[0]), C.size_t(len(msg)),
467467
(*C.uint8_t)(&suite[0]), C.size_t(len(suite)),
468468
(*C.uint8_t)(a), C.size_t(len(aug)))
469469
return (*P1)(&q)
470470
}
471471

472-
func EncodeToP1(digest, suite, aug []byte) *P1 {
472+
func EncodeToP1(msg, suite, aug []byte) *P1 {
473473
var (
474474
q p1
475475
a *byte
476476
)
477477
if len(aug) != 0 {
478478
a = &aug[0]
479479
}
480-
C.blst_encode_to_g1(&q, (*C.uint8_t)(&digest[0]), C.size_t(len(digest)),
480+
C.blst_encode_to_g1(&q, (*C.uint8_t)(&msg[0]), C.size_t(len(msg)),
481481
(*C.uint8_t)(&suite[0]), C.size_t(len(suite)),
482482
(*C.uint8_t)(a), C.size_t(len(aug)))
483483
return (*P1)(&q)
@@ -515,29 +515,29 @@ func (p *P2) AddOrDoubleAffine(other *P2Affine) {
515515
C.blst_p2_add_or_double_affine((*p2)(p), (*p2)(p), (*p2Affine)(other))
516516
}
517517

518-
func HashToP2(digest, suite, aug []byte) *P2 {
518+
func HashToP2(msg, suite, aug []byte) *P2 {
519519
var (
520520
q p2
521521
a *byte
522522
)
523523
if len(aug) != 0 {
524524
a = &aug[0]
525525
}
526-
C.blst_hash_to_g2(&q, (*C.uint8_t)(&digest[0]), C.size_t(len(digest)),
526+
C.blst_hash_to_g2(&q, (*C.uint8_t)(&msg[0]), C.size_t(len(msg)),
527527
(*C.uint8_t)(&suite[0]), C.size_t(len(suite)),
528528
(*C.uint8_t)(a), C.size_t(len(aug)))
529529
return (*P2)(&q)
530530
}
531531

532-
func EncodeToP2(digest, suite, aug []byte) *P2 {
532+
func EncodeToP2(msg, suite, aug []byte) *P2 {
533533
var (
534534
q p2
535535
a *byte
536536
)
537537
if len(aug) != 0 {
538538
a = &aug[0]
539539
}
540-
C.blst_encode_to_g2(&q, (*C.uint8_t)(&digest[0]), C.size_t(len(digest)),
540+
C.blst_encode_to_g2(&q, (*C.uint8_t)(&msg[0]), C.size_t(len(msg)),
541541
(*C.uint8_t)(&suite[0]), C.size_t(len(suite)),
542542
(*C.uint8_t)(a), C.size_t(len(aug)))
543543
return (*P2)(&q)

minpk/minpk.go

+28-10
Original file line numberDiff line numberDiff line change
@@ -58,29 +58,43 @@ func PrivateKeyFromBytes(data []byte) (*PrivateKey, error) {
5858
}
5959
}
6060

61-
func Sign(priv *PrivateKey, digest []byte, scheme blst.Scheme) *Signature {
61+
func Sign(priv *PrivateKey, msg []byte, scheme blst.Scheme) *Signature {
6262
var aug []byte
6363
if scheme == blst.Augmentation {
6464
aug = priv.PublicKey().Bytes()
6565
}
66-
hash := blst.HashToP2(digest, scheme.SuiteG(2), aug)
67-
return (*Signature)((*blst.Scalar)(priv).SignInG1Affine(hash))
66+
point := blst.HashToP2(msg, scheme.Tag(2), aug)
67+
return (*Signature)((*blst.Scalar)(priv).SignInG1Affine(point))
6868
}
6969

70-
func Verify(pub *PublicKey, digest []byte, sig *Signature, scheme blst.Scheme) error {
71-
return sig.Verify(pub, digest, scheme)
70+
func Prove(priv *PrivateKey) *Signature {
71+
pub := priv.PublicKey().Bytes()
72+
point := blst.HashToP2(pub, blst.ProofOfPossessionTag(2), nil)
73+
return (*Signature)((*blst.Scalar)(priv).SignInG1Affine(point))
74+
}
75+
76+
func Verify(pub *PublicKey, msg []byte, sig *Signature, scheme blst.Scheme) error {
77+
return sig.Verify(pub, msg, scheme)
78+
}
79+
80+
func VerifyProof(pub *PublicKey, sig *Signature) error {
81+
return sig.VerifyProof(pub)
7282
}
7383

7484
func AggregateVerify(items []*PubDigestPair, sig *Signature, scheme blst.Scheme) error {
7585
return sig.AggregateVerify(items, scheme)
7686
}
7787

78-
func (priv *PrivateKey) Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error) {
88+
func (priv *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ([]byte, error) {
7989
scheme := blst.Basic
8090
if s, ok := opts.(blst.Scheme); ok {
8191
scheme = s
8292
}
83-
return Sign(priv, digest, scheme).Bytes(), nil
93+
return Sign(priv, msg, scheme).Bytes(), nil
94+
}
95+
96+
func (priv *PrivateKey) Prove() *Signature {
97+
return Prove(priv)
8498
}
8599

86100
func (priv *PrivateKey) PublicKey() *PublicKey {
@@ -168,12 +182,16 @@ func (sig *Signature) IsValid() error {
168182
}
169183
}
170184

171-
func (sig *Signature) Verify(pub *PublicKey, digest []byte, scheme blst.Scheme) error {
185+
func (sig *Signature) Verify(pub *PublicKey, msg []byte, scheme blst.Scheme) error {
172186
var aug []byte
173187
if scheme == blst.Augmentation {
174188
aug = pub.Bytes()
175189
}
176-
return (*blst.P2Affine)(sig).CoreVerify(true, (*blst.P1Affine)(pub), true, digest, true, scheme.SuiteG(2), aug)
190+
return (*blst.P2Affine)(sig).CoreVerify(true, (*blst.P1Affine)(pub), true, msg, true, scheme.Tag(2), aug)
191+
}
192+
193+
func (sig *Signature) VerifyProof(pub *PublicKey) error {
194+
return (*blst.P2Affine)(sig).CoreVerify(true, (*blst.P1Affine)(pub), true, pub.Bytes(), true, blst.ProofOfPossessionTag(2), nil)
177195
}
178196

179197
func AggregateSignatures(sigs []*Signature) (*Signature, error) {
@@ -243,5 +261,5 @@ func (sig *Signature) AggregateVerify(items []*PubDigestPair, scheme blst.Scheme
243261
pairs: items,
244262
scheme: scheme,
245263
}
246-
return (*blst.P2Affine)(sig).CoreAggregateVerify(true, pairs, true, true, scheme.SuiteG(2))
264+
return (*blst.P2Affine)(sig).CoreAggregateVerify(true, pairs, true, true, scheme.Tag(2))
247265
}

minsig/minsig.go

+28-10
Original file line numberDiff line numberDiff line change
@@ -58,29 +58,43 @@ func PrivateKeyFromBytes(data []byte) (*PrivateKey, error) {
5858
}
5959
}
6060

61-
func Sign(priv *PrivateKey, digest []byte, scheme blst.Scheme) *Signature {
61+
func Sign(priv *PrivateKey, msg []byte, scheme blst.Scheme) *Signature {
6262
var aug []byte
6363
if scheme == blst.Augmentation {
6464
aug = priv.PublicKey().Bytes()
6565
}
66-
hash := blst.HashToP1(digest, scheme.SuiteG(1), aug)
67-
return (*Signature)((*blst.Scalar)(priv).SignInG2Affine(hash))
66+
point := blst.HashToP1(msg, scheme.Tag(1), aug)
67+
return (*Signature)((*blst.Scalar)(priv).SignInG2Affine(point))
6868
}
6969

70-
func Verify(pub *PublicKey, digest []byte, sig *Signature, scheme blst.Scheme) error {
71-
return sig.Verify(pub, digest, scheme)
70+
func Prove(priv *PrivateKey) *Signature {
71+
pub := priv.PublicKey().Bytes()
72+
point := blst.HashToP1(pub, blst.ProofOfPossessionTag(1), nil)
73+
return (*Signature)((*blst.Scalar)(priv).SignInG2Affine(point))
74+
}
75+
76+
func Verify(pub *PublicKey, msg []byte, sig *Signature, scheme blst.Scheme) error {
77+
return sig.Verify(pub, msg, scheme)
78+
}
79+
80+
func VerifyProof(pub *PublicKey, sig *Signature) error {
81+
return sig.VerifyProof(pub)
7282
}
7383

7484
func AggregateVerify(items []*PubDigestPair, sig *Signature, scheme blst.Scheme) error {
7585
return sig.AggregateVerify(items, scheme)
7686
}
7787

78-
func (priv *PrivateKey) Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) ([]byte, error) {
88+
func (priv *PrivateKey) Sign(rand io.Reader, msg []byte, opts crypto.SignerOpts) ([]byte, error) {
7989
scheme := blst.Basic
8090
if s, ok := opts.(blst.Scheme); ok {
8191
scheme = s
8292
}
83-
return Sign(priv, digest, scheme).Bytes(), nil
93+
return Sign(priv, msg, scheme).Bytes(), nil
94+
}
95+
96+
func (priv *PrivateKey) Prove() *Signature {
97+
return Prove(priv)
8498
}
8599

86100
func (priv *PrivateKey) PublicKey() *PublicKey {
@@ -167,12 +181,16 @@ func (sig *Signature) IsValid() error {
167181
}
168182
}
169183

170-
func (sig *Signature) Verify(pub *PublicKey, digest []byte, scheme blst.Scheme) error {
184+
func (sig *Signature) Verify(pub *PublicKey, msg []byte, scheme blst.Scheme) error {
171185
var aug []byte
172186
if scheme == blst.Augmentation {
173187
aug = pub.Bytes()
174188
}
175-
return (*blst.P1Affine)(sig).CoreVerify(true, (*blst.P2Affine)(pub), true, digest, true, scheme.SuiteG(1), aug)
189+
return (*blst.P1Affine)(sig).CoreVerify(true, (*blst.P2Affine)(pub), true, msg, true, scheme.Tag(1), aug)
190+
}
191+
192+
func (sig *Signature) VerifyProof(pub *PublicKey) error {
193+
return (*blst.P1Affine)(sig).CoreVerify(true, (*blst.P2Affine)(pub), true, pub.Bytes(), true, blst.ProofOfPossessionTag(1), nil)
176194
}
177195

178196
func AggregateSignatures(sigs []*Signature) (*Signature, error) {
@@ -242,5 +260,5 @@ func (sig *Signature) AggregateVerify(items []*PubDigestPair, scheme blst.Scheme
242260
pairs: items,
243261
scheme: scheme,
244262
}
245-
return (*blst.P1Affine)(sig).CoreAggregateVerify(true, pairs, true, true, scheme.SuiteG(1))
263+
return (*blst.P1Affine)(sig).CoreAggregateVerify(true, pairs, true, true, scheme.Tag(1))
246264
}

utils.go

+12-5
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,28 @@ func runInParallel(n int, fn func(i int) error) error {
5151
type Scheme int
5252

5353
const (
54-
Basic Scheme = iota
54+
Basic Scheme = 1 + iota
5555
Augmentation
56+
ProofOfPossession
5657
)
5758

5859
func (Scheme) HashFunc() crypto.Hash {
5960
return 0
6061
}
6162

62-
func (s Scheme) SuiteG(g int) []byte {
63+
func (s Scheme) Tag(g int) []byte {
6364
switch s {
6465
case Basic:
65-
return []byte(fmt.Sprintf("BLS_SIG_BLS12381G%d_XMD:SHA-256_SSWU_RO_NUL_", g))
66+
return fmt.Appendf(nil, "BLS_SIG_BLS12381G%d_XMD:SHA-256_SSWU_RO_NUL_", g)
6667
case Augmentation:
67-
return []byte(fmt.Sprintf("BLS_SIG_BLS12381G%d_XMD:SHA-256_SSWU_RO_AUG_", g))
68+
return fmt.Appendf(nil, "BLS_SIG_BLS12381G%d_XMD:SHA-256_SSWU_RO_AUG_", g)
69+
case ProofOfPossession:
70+
return fmt.Appendf(nil, "BLS_SIG_BLS12381G%d_XMD:SHA-256_SSWU_RO_POP_", g)
6871
default:
69-
return make([]byte, 0)
72+
panic("unknown scheme")
7073
}
7174
}
75+
76+
func ProofOfPossessionTag(g int) []byte {
77+
return fmt.Appendf(nil, "BLS_POP_BLS12381G%d_XMD:SHA-256_SSWU_RO_POP_", g)
78+
}

0 commit comments

Comments
 (0)