sometimes r and s are < 20 bytes because of how go encodes big.Int, take this into account

This commit is contained in:
Jeff Becker
2016-07-10 09:17:47 -04:00
parent bdef8ebbcc
commit 95c0f1d4f0
2 changed files with 47 additions and 2 deletions

View File

@ -162,8 +162,12 @@ func (ds *DSASigner) SignHash(h []byte) (sig []byte, err error) {
r, s, err = dsa.Sign(rand.Reader, ds.k, h)
if err == nil {
sig = make([]byte, 40)
copy(sig, r.Bytes())
copy(sig[20:], s.Bytes())
rb := r.Bytes()
rl := len(rb)
copy(sig[20-rl:20], rb)
sb := s.Bytes()
sl := len(sb)
copy(sig[20+(20-sl):], sb)
}
return
}

View File

@ -1,6 +1,7 @@
package crypto
import (
log "github.com/sirupsen/logrus"
"testing"
)
@ -44,3 +45,43 @@ func TestDSA(t *testing.T) {
t.Fail()
}
}
func BenchmarkDSAGenerate(b *testing.B) {
var sk DSAPrivateKey
for n := 0 ; n < b.N ; n ++ {
_, err := sk.Generate()
if err != nil {
panic(err.Error())
}
}
}
func BenchmarkDSASignVerify(b *testing.B) {
var sk DSAPrivateKey
var pk DSAPublicKey
var err error
sk, err = sk.Generate()
if err != nil {
panic(err.Error())
}
pk, err = sk.Public()
if err != nil {
panic(err.Error())
}
s, _ := sk.NewSigner()
v, _ := pk.NewVerifier()
data := make([]byte, 1024)
fail := 0
for n := 0 ; n < b.N ; n ++ {
sig, err := s.Sign(data)
if err != nil {
panic(err.Error())
}
err = v.Verify(data, sig)
if err != nil {
fail ++
}
}
log.Infof("%d fails %d signs", fail, b.N)
}