165 lines
6.7 KiB
Go
165 lines
6.7 KiB
Go
package rsa
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/ucan-wg/go-did-it/crypto"
|
|
"github.com/ucan-wg/go-did-it/crypto/_testsuite"
|
|
)
|
|
|
|
var harness2048 = testsuite.TestHarness[*PublicKey, *PrivateKey]{
|
|
Name: "rsa-2048",
|
|
GenerateKeyPair: func() (*PublicKey, *PrivateKey, error) { return GenerateKeyPair(2048) },
|
|
PublicKeyFromPublicKeyMultibase: PublicKeyFromPublicKeyMultibase,
|
|
PublicKeyFromX509DER: PublicKeyFromX509DER,
|
|
PublicKeyFromX509PEM: PublicKeyFromX509PEM,
|
|
PrivateKeyFromPKCS8DER: PrivateKeyFromPKCS8DER,
|
|
PrivateKeyFromPKCS8PEM: PrivateKeyFromPKCS8PEM,
|
|
MultibaseCode: MultibaseCode,
|
|
DefaultHash: crypto.SHA256,
|
|
OtherHashes: []crypto.Hash{crypto.SHA384, crypto.SHA512},
|
|
}
|
|
|
|
var harness3072 = testsuite.TestHarness[*PublicKey, *PrivateKey]{
|
|
Name: "rsa-3072",
|
|
GenerateKeyPair: func() (*PublicKey, *PrivateKey, error) { return GenerateKeyPair(3072) },
|
|
PublicKeyFromPublicKeyMultibase: PublicKeyFromPublicKeyMultibase,
|
|
PublicKeyFromX509DER: PublicKeyFromX509DER,
|
|
PublicKeyFromX509PEM: PublicKeyFromX509PEM,
|
|
PrivateKeyFromPKCS8DER: PrivateKeyFromPKCS8DER,
|
|
PrivateKeyFromPKCS8PEM: PrivateKeyFromPKCS8PEM,
|
|
MultibaseCode: MultibaseCode,
|
|
DefaultHash: crypto.SHA384,
|
|
OtherHashes: []crypto.Hash{crypto.SHA512},
|
|
}
|
|
|
|
var harness4096 = testsuite.TestHarness[*PublicKey, *PrivateKey]{
|
|
Name: "rsa-4096",
|
|
GenerateKeyPair: func() (*PublicKey, *PrivateKey, error) { return GenerateKeyPair(4096) },
|
|
PublicKeyFromPublicKeyMultibase: PublicKeyFromPublicKeyMultibase,
|
|
PublicKeyFromX509DER: PublicKeyFromX509DER,
|
|
PublicKeyFromX509PEM: PublicKeyFromX509PEM,
|
|
PrivateKeyFromPKCS8DER: PrivateKeyFromPKCS8DER,
|
|
PrivateKeyFromPKCS8PEM: PrivateKeyFromPKCS8PEM,
|
|
MultibaseCode: MultibaseCode,
|
|
DefaultHash: crypto.SHA512,
|
|
OtherHashes: []crypto.Hash{},
|
|
}
|
|
|
|
func TestSuite2048(t *testing.T) {
|
|
testsuite.TestSuite(t, harness2048)
|
|
}
|
|
|
|
func TestSuite3072(t *testing.T) {
|
|
testsuite.TestSuite(t, harness3072)
|
|
}
|
|
|
|
func TestSuite4096(t *testing.T) {
|
|
testsuite.TestSuite(t, harness4096)
|
|
}
|
|
|
|
func BenchmarkSuite2048(b *testing.B) {
|
|
testsuite.BenchSuite(b, harness2048)
|
|
}
|
|
|
|
func BenchmarkSuite3072(b *testing.B) {
|
|
testsuite.BenchSuite(b, harness3072)
|
|
}
|
|
|
|
func BenchmarkSuite4096(b *testing.B) {
|
|
testsuite.BenchSuite(b, harness4096)
|
|
}
|
|
|
|
func TestPublicKeyX509(t *testing.T) {
|
|
// openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
|
|
// openssl pkey -in private_key.pem -pubout -out public_key.pem
|
|
pem := `-----BEGIN PUBLIC KEY-----
|
|
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyLFQUbVVo/rctJaCzR5z
|
|
g622eUNBwZmA1vnDEXnHWBl3y5RJF5zyTdlouujjmEuu6qsXk1NCNQ3dLH2iquI8
|
|
iFFAhS4kTX6JS+wR3vHLhga1oFkPceGFEUG/3vxn52ozFs8hikhq/P09HmLub7Vc
|
|
VklwrGvTbEa5Fn/2Kz6olw5ExYI14Unsl+A3iw8AXPL9/acD+ehoyx3/zKFrVTKx
|
|
e9jdoWX8L7IpqM2HOSu23/3E2IwH2GdY0C8575AiD/O555hie7JHkzF3I4E85gPd
|
|
ZgXYFShIfgOzDV0q4oP0pzqYkErhdjOpigCMjDuIC4OueZYqYJrP2rdpzuqoqk07
|
|
NwIDAQAB
|
|
-----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 genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
|
|
pem := `-----BEGIN PRIVATE KEY-----
|
|
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDIsVBRtVWj+ty0
|
|
loLNHnODrbZ5Q0HBmYDW+cMRecdYGXfLlEkXnPJN2Wi66OOYS67qqxeTU0I1Dd0s
|
|
faKq4jyIUUCFLiRNfolL7BHe8cuGBrWgWQ9x4YURQb/e/GfnajMWzyGKSGr8/T0e
|
|
Yu5vtVxWSXCsa9NsRrkWf/YrPqiXDkTFgjXhSeyX4DeLDwBc8v39pwP56GjLHf/M
|
|
oWtVMrF72N2hZfwvsimozYc5K7bf/cTYjAfYZ1jQLznvkCIP87nnmGJ7skeTMXcj
|
|
gTzmA91mBdgVKEh+A7MNXSrig/SnOpiQSuF2M6mKAIyMO4gLg655lipgms/at2nO
|
|
6qiqTTs3AgMBAAECggEAVFVqZoN4QumSYBKVUYOX0AAp2ygflC6gnPWkeo39bjB5
|
|
jiM4WcNacMtIvq5JoYBANx2BUSfd/PRf+ierOPrLrA7UuYJLwALJyA0h71kVCLN+
|
|
FC0Il/bIF5nU+mt/cBfI8y9ELVtEFh6GVeQFxQxlil7fCZ1f4TKQ6XsJI1/3sU2P
|
|
hbOuyfKKiWym8n5BV6NP3gotjnT01I+seplx3oMOKIaGl0KMgkuU2r8o8WMjA7Gx
|
|
1WWPJDpUdyYDYSUH8PubXowHkE+2RXddZ+tGvS8mF/A4Q0hdj2T9XvzyZ813O9Tv
|
|
n522A9QQE8YlqwAYh4z3VoNhz+Fi1mQfYsIblNygSQKBgQDrk+kB/dz92RPhP/rh
|
|
zAOvwRuI2TOaw98kdgpVlb6gMVmN2EWkzkdnwQDJhV+MFZob4wi+TpsDPv4fjubq
|
|
gqbM/MYc0kNtIEA4GkIJLCK5Hh7c6kCQfya+/eq4Ju6C3+I4R46/+9E7ixA83Zjf
|
|
ftqTlYOrlMby84Lvsf81LtiMiQKBgQDaFzXpDBPOIaup68k9NeZyXHKI8wNQXkui
|
|
JyjM9A3U2D8O9Yty8G+Oq0B4oUGlyenMGJiQmf3bAffJBkLCMXCGXYD8CCKsiSJ6
|
|
R6XBfbpPkzCwl67FFN/8Z0nxZ0lbxd2ZMTC4qxH4peD5TNZM89kTpSNXPrr55zzm
|
|
qREmxisZvwKBgQCNK3jBScjpkfFY1UdZkjFPXDBM5KQJBYGtztLIkNDIHGqnFsg9
|
|
R6QAp+b53GPyhWtxdK7jpCU+X7xXWwJD3AFq67sowFPJjD8Pn6Sc7IbuWf9ysSn5
|
|
rUihwXWr3yCk6tcclL0VjSjIPsB/SOf4XoNLV5is9J34Lzbyvr7JtwXryQKBgQCM
|
|
m3xRdUzrkD/J/M+w3ChoQPxDGVJgpXrj35Vplku4l3cIYPz4LNXvyK93VpgpmGVZ
|
|
Bd6PFAlcAwfLHnM6Gn/u0SgQ1fns/TkyVzEh77qIBWDV6eVvAQdsBvfgYPQl7Arz
|
|
8ofz969NfTzv3j8oO+sPxF9lp3cLGa/lEsmREyDEpwKBgQCvW+NK93oajo358gKh
|
|
/xfSv7yMiSL26NcIgHmQouZVXJ3Dg0KSISx8tgY0/7TwC2mPa0Ryhpb/3HtAIXoY
|
|
eqkQGHqnC4voxSoati667mMGdHL1+12WvQmhfTLCWmZ5ccNlR+aFD20TGbMxnejS
|
|
XnARctVkIcUYORcYwvuu9meDkw==
|
|
-----END PRIVATE KEY-----
|
|
`
|
|
|
|
priv, err := PrivateKeyFromPKCS8PEM(pem)
|
|
require.NoError(t, err)
|
|
|
|
rt := priv.ToPKCS8PEM()
|
|
require.Equal(t, pem, rt)
|
|
}
|
|
|
|
func TestSignatureASN1(t *testing.T) {
|
|
// openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048
|
|
// openssl pkey -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-----
|
|
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmtKXCTkUDcKbZGsEEUTo
|
|
16xblCyh6zmA8pXVGgmC66QiTNdKzxdwTykXTDs9sEre9ea34h2M7dwrA1weAmBu
|
|
grAXe0QmIXIqjFKRKdfty09yWVtKF7FGwEMlhKftWC225R+tRuLwbKG4cCSzHxcf
|
|
JfqCYqGDM7BrF39ilQzFYw5sUiWn3ppRPWa2oEV3cw19zFnHMbEHIQIdFyCcIv5x
|
|
GUSJ6sJVp0YvsODsZbA+Zyb2UMRfXD8fDHm9bJQCY0x/wGJLfvJmWtZLciwc145U
|
|
BN3SezY30NviZtZBKWjXgb6gL69L94U10/8ghmA30DY7bKs4+/7R2nOw91CO4rCo
|
|
1QIDAQAB
|
|
-----END PUBLIC KEY-----
|
|
`
|
|
pub, err := PublicKeyFromX509PEM(pubPem)
|
|
require.NoError(t, err)
|
|
|
|
b64sig := `BdvBkZWxIVE2mfM48H1WlOs3k9NzyS4oUxAMOZWNNTYDU6+DLbhZ7Hnt3rRKX3m6f1cX5DCsHcPC
|
|
6sNtsR8Xp9u09GWCN/K28fF7Pcl0E87MdhAUL7jKNK5bb1XWx/GCUmoKXRZiR/gA10iB2Lmjd1MC
|
|
HItTCig91gmFm5PO67u9yM+cqE2nGyOh13/kT5Np9MUyaE9dkjoQGum23Ta6m7v0atWsPhO5aVVI
|
|
76vLwGhYAhQe22RxBlPRXyRInr0EnVgHQOe211o//erPZYQAm+N1kK+yjV8NbPxJX+r5sYUE19NL
|
|
MCB+kOgWk51uJwuiuHlffGMBPxku/t+skxI7Bw==`
|
|
sig, err := base64.StdEncoding.DecodeString(b64sig)
|
|
require.NoError(t, err)
|
|
|
|
require.True(t, pub.VerifyASN1([]byte("message"), sig))
|
|
}
|