106 lines
3.4 KiB
Go
106 lines
3.4 KiB
Go
package secp256k1
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"code.sonr.org/go/did-it/crypto"
|
|
"code.sonr.org/go/did-it/crypto/_testsuite"
|
|
)
|
|
|
|
var harness = testsuite.TestHarness[*PublicKey, *PrivateKey]{
|
|
Name: "secp256k1",
|
|
GenerateKeyPair: GenerateKeyPair,
|
|
PublicKeyFromBytes: PublicKeyFromBytes,
|
|
PublicKeyFromPublicKeyMultibase: PublicKeyFromPublicKeyMultibase,
|
|
PublicKeyFromX509DER: PublicKeyFromX509DER,
|
|
PublicKeyFromX509PEM: PublicKeyFromX509PEM,
|
|
PrivateKeyFromBytes: PrivateKeyFromBytes,
|
|
PrivateKeyFromPKCS8DER: PrivateKeyFromPKCS8DER,
|
|
PrivateKeyFromPKCS8PEM: PrivateKeyFromPKCS8PEM,
|
|
MultibaseCode: MultibaseCode,
|
|
DefaultHash: crypto.SHA256,
|
|
OtherHashes: []crypto.Hash{crypto.KECCAK_256},
|
|
PublicKeyBytesSize: PublicKeyBytesSize,
|
|
PrivateKeyBytesSize: PrivateKeyBytesSize,
|
|
SignatureBytesSize: SignatureBytesSize,
|
|
}
|
|
|
|
func TestSuite(t *testing.T) {
|
|
testsuite.TestSuite(t, harness)
|
|
}
|
|
|
|
func BenchmarkSuite(b *testing.B) {
|
|
testsuite.BenchSuite(b, harness)
|
|
}
|
|
|
|
func TestPublicKeyX509(t *testing.T) {
|
|
// openssl ecparam -genkey -name secp256k1 | openssl pkcs8 -topk8 -nocrypt -out secp256k1-key.pem
|
|
// openssl pkey -in secp256k1-key.pem -pubout -out secp256k1-pubkey.pem
|
|
pem := `-----BEGIN PUBLIC KEY-----
|
|
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEFVP6HKjIReiiUgrC+t+FjG5u0PXIoBmN
|
|
V1MMmoOFfKlrD/HuWUjjlw0mDKZcG7AM7JKPTWMOCcvUR2B8BUO3VQ==
|
|
-----END PUBLIC KEY-----
|
|
`
|
|
|
|
pub, err := PublicKeyFromX509PEM(pem)
|
|
require.NoError(t, err)
|
|
|
|
rt := pub.ToX509PEM()
|
|
require.Equal(t, pem, rt)
|
|
}
|
|
|
|
func TestPrivateKeyPKCS8(t *testing.T) {
|
|
// openssl ecparam -genkey -name secp256k1 | openssl pkcs8 -topk8 -nocrypt -out secp256k1-key.pem
|
|
pem := `-----BEGIN PRIVATE KEY-----
|
|
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgZW9JcJ1kN+DW2IFgqKJu
|
|
KS+39/xVa0n2J+lCr7hYGTihRANCAAQVU/ocqMhF6KJSCsL634WMbm7Q9cigGY1X
|
|
Uwyag4V8qWsP8e5ZSOOXDSYMplwbsAzsko9NYw4Jy9RHYHwFQ7dV
|
|
-----END PRIVATE KEY-----
|
|
`
|
|
|
|
priv, err := PrivateKeyFromPKCS8PEM(pem)
|
|
require.NoError(t, err)
|
|
|
|
rt := priv.ToPKCS8PEM()
|
|
require.Equal(t, pem, rt)
|
|
}
|
|
|
|
func FuzzPrivateKeyFromPKCS8PEM(f *testing.F) {
|
|
f.Add(`-----BEGIN PRIVATE KEY-----
|
|
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgZW9JcJ1kN+DW2IFgqKJu
|
|
KS+39/xVa0n2J+lCr7hYGTihRANCAAQVU/ocqMhF6KJSCsL634WMbm7Q9cigGY1X
|
|
Uwyag4V8qWsP8e5ZSOOXDSYMplwbsAzsko9NYw4Jy9RHYHwFQ7dV
|
|
-----END PRIVATE KEY-----
|
|
`)
|
|
|
|
f.Fuzz(func(t *testing.T, data string) {
|
|
// looking for panics
|
|
_, _ = PrivateKeyFromPKCS8PEM(data)
|
|
})
|
|
}
|
|
|
|
func TestSignatureASN1(t *testing.T) {
|
|
// openssl ecparam -genkey -name secp256k1 -noout -out private.pem
|
|
// openssl ec -in private.pem -pubout -out public.pem
|
|
// echo -n "message" | openssl dgst -sha256 -sign private.pem -out signature.der
|
|
// echo -n "message" | openssl dgst -sha256 -verify public.pem -signature signature.der
|
|
|
|
pubPem := `-----BEGIN PUBLIC KEY-----
|
|
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEszL1+ZFqUMAHjLAyzMW7xMBPZek/8cNj
|
|
1qI7EgQooB3f8Sh7JwvXu8cosRnjjvYVvS7OliRsbvuceCQ7HBC4fA==
|
|
-----END PUBLIC KEY-----
|
|
`
|
|
pub, err := PublicKeyFromX509PEM(pubPem)
|
|
require.NoError(t, err)
|
|
|
|
b64sig := `MEYCIQDv5SLy768FbOafzDlrxIeeoEn7tKpYBSK6WcKaOZ6AJAIhAKXV6VAwiPq4uk9TpGyFN5JK
|
|
8jZPrQ7hdRR5veKKDX2w`
|
|
sig, err := base64.StdEncoding.DecodeString(b64sig)
|
|
require.NoError(t, err)
|
|
|
|
require.True(t, pub.VerifyASN1([]byte("message"), sig))
|
|
}
|