ceremonyclient/go-libp2p/p2p/security/tls/crypto_test.go

107 lines
5.7 KiB
Go
Raw Normal View History

2023-08-21 03:50:38 +00:00
package libp2ptls
import (
"crypto/x509"
"encoding/hex"
"testing"
"github.com/libp2p/go-libp2p/core/peer"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestNewIdentityCertificates(t *testing.T) {
_, key := createPeer(t)
cn := "a.test.name"
email := "unittest@example.com"
t.Run("NewIdentity with default template", func(t *testing.T) {
// Generate an identity using the default template
id, err := NewIdentity(key)
assert.NoError(t, err)
// Extract the x509 certificate
x509Cert, err := x509.ParseCertificate(id.config.Certificates[0].Certificate[0])
assert.NoError(t, err)
// verify the common name and email are not set
assert.Empty(t, x509Cert.Subject.CommonName)
assert.Empty(t, x509Cert.EmailAddresses)
})
t.Run("NewIdentity with custom template", func(t *testing.T) {
tmpl, err := certTemplate()
assert.NoError(t, err)
tmpl.Subject.CommonName = cn
tmpl.EmailAddresses = []string{email}
// Generate an identity using the custom template
id, err := NewIdentity(key, WithCertTemplate(tmpl))
assert.NoError(t, err)
// Extract the x509 certificate
x509Cert, err := x509.ParseCertificate(id.config.Certificates[0].Certificate[0])
assert.NoError(t, err)
// verify the common name and email are set
assert.Equal(t, cn, x509Cert.Subject.CommonName)
assert.Equal(t, email, x509Cert.EmailAddresses[0])
})
}
func TestVectors(t *testing.T) {
type testcase struct {
name string
data string
peerID string
error string
}
testcases := []testcase{
{
name: "ED25519 Peer ID",
data: "308201773082011ea003020102020900f5bd0debaa597f52300a06082a8648ce3d04030230003020170d3735303130313030303030305a180f34303936303130313030303030305a30003059301306072a8648ce3d020106082a8648ce3d030107034200046bf9871220d71dcb3483ecdfcbfcc7c103f8509d0974b3c18ab1f1be1302d643103a08f7a7722c1b247ba3876fe2c59e26526f479d7718a85202ddbe47562358a37f307d307b060a2b0601040183a25a01010101ff046a30680424080112207fda21856709c5ae12fd6e8450623f15f11955d384212b89f56e7e136d2e17280440aaa6bffabe91b6f30c35e3aa4f94b1188fed96b0ffdd393f4c58c1c047854120e674ce64c788406d1c2c4b116581fd7411b309881c3c7f20b46e54c7e6fe7f0f300a06082a8648ce3d040302034700304402207d1a1dbd2bda235ff2ec87daf006f9b04ba076a5a5530180cd9c2e8f6399e09d0220458527178c7e77024601dbb1b256593e9b96d961b96349d1f560114f61a87595",
peerID: "12D3KooWJRSrypvnpHgc6ZAgyCni4KcSmbV7uGRaMw5LgMKT18fq",
},
{
name: "ECDSA Peer ID",
data: "308201c030820166a003020102020900eaf419a6e3edb4a6300a06082a8648ce3d04030230003020170d3735303130313030303030305a180f34303936303130313030303030305a30003059301306072a8648ce3d020106082a8648ce3d030107034200048dbf1116c7c608d6d5292bd826c3feb53483a89fce434bf64538a359c8e07538ff71f6766239be6a146dcc1a5f3bb934bcd4ae2ae1d4da28ac68b4a20593f06ba381c63081c33081c0060a2b0601040183a25a01010101ff0481ae3081ab045f0803125b3059301306072a8648ce3d020106082a8648ce3d0301070342000484b93fa456a74bd0153919f036db7bc63c802f055bc7023395d0203de718ee0fc7b570b767cdd858aca6c7c4113ff002e78bd2138ac1a3b26dde3519e06979ad04483046022100bc84014cea5a41feabdf4c161096564b9ccf4b62fbef4fe1cd382c84e11101780221009204f086a84cb8ed8a9ddd7868dc90c792ee434adf62c66f99a08a5eba11615b300a06082a8648ce3d0403020348003045022054b437be9a2edf591312d68ff24bf91367ad4143f76cf80b5658f232ade820da022100e23b48de9df9c25d4c83ddddf75d2676f0b9318ee2a6c88a736d85eab94a912f",
peerID: "QmZcrvr3r4S3QvwFdae3c2EWTfo792Y14UpzCZurhmiWeX",
},
{
name: "secp256k1 Peer ID",
data: "3082018230820128a003020102020900f3b305f55622cfdf300a06082a8648ce3d04030230003020170d3735303130313030303030305a180f34303936303130313030303030305a30003059301306072a8648ce3d020106082a8648ce3d0301070342000458f7e9581748ff9bdd933b655cc0e5552a1248f840658cc221dec2186b5a2fe4641b86ab7590a3422cdbb1000cf97662f27e5910d7569f22feed8829c8b52e0fa38188308185308182060a2b0601040183a25a01010101ff0471306f042508021221026b053094d1112bce799dc8026040ae6d4eb574157929f1598172061f753d9b1b04463044022040712707e97794c478d93989aaa28ae1f71c03af524a8a4bd2d98424948a782302207b61b7f074b696a25fb9e0059141a811cccc4cc28042d9301b9b2a4015e87470300a06082a8648ce3d04030203480030450220143ae4d86fdc8675d2480bb6912eca5e39165df7f572d836aa2f2d6acfab13f8022100831d1979a98f0c4a6fb5069ca374de92f1a1205c962a6d90ad3d7554cb7d9df4",
peerID: "16Uiu2HAm2dSCBFxuge46aEt7U1oejtYuBUZXxASHqmcfVmk4gsbx",
},
{
name: "Invalid certificate",
data: "308201773082011da003020102020830a73c5d896a1109300a06082a8648ce3d04030230003020170d3735303130313030303030305a180f34303936303130313030303030305a30003059301306072a8648ce3d020106082a8648ce3d03010703420004bbe62df9a7c1c46b7f1f21d556deec5382a36df146fb29c7f1240e60d7d5328570e3b71d99602b77a65c9b3655f62837f8d66b59f1763b8c9beba3be07778043a37f307d307b060a2b0601040183a25a01010101ff046a3068042408011220ec8094573afb9728088860864f7bcea2d4fd412fef09a8e2d24d482377c20db60440ecabae8354afa2f0af4b8d2ad871e865cb5a7c0c8d3dbdbf42de577f92461a0ebb0a28703e33581af7d2a4f2270fc37aec6261fcc95f8af08f3f4806581c730a300a06082a8648ce3d040302034800304502202dfb17a6fa0f94ee0e2e6a3b9fb6e986f311dee27392058016464bd130930a61022100ba4b937a11c8d3172b81e7cd04aedb79b978c4379c2b5b24d565dd5d67d3cb3c",
error: "signature invalid",
},
}
for _, tc := range testcases {
t.Run(tc.name, func(t *testing.T) {
data, err := hex.DecodeString(tc.data)
require.NoError(t, err)
cert, err := x509.ParseCertificate(data)
require.NoError(t, err)
key, err := PubKeyFromCertChain([]*x509.Certificate{cert})
if tc.error != "" {
require.Error(t, err)
require.Contains(t, err.Error(), tc.error)
return
}
require.NoError(t, err)
id, err := peer.IDFromPublicKey(key)
require.NoError(t, err)
expectedID, err := peer.Decode(tc.peerID)
require.NoError(t, err)
require.Equal(t, expectedID, id)
})
}
}