Skip to content

Commit 22160c0

Browse files
committed
Pem->PEM
1 parent a5d59db commit 22160c0

7 files changed

Lines changed: 48 additions & 36 deletions

File tree

cert/cert.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ type Certificate interface {
5959
PublicKey() []byte
6060

6161
// PublicKeyPem is the value of PublicKey marshalled to PEM
62-
PublicKeyPem() []byte
62+
PublicKeyPEM() []byte
6363

6464
// Curve identifies which curve was used for the PublicKey and Signature.
6565
Curve() Curve

cert/cert_v1.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func (c *certificateV1) PublicKey() []byte {
8383
return c.details.publicKey
8484
}
8585

86-
func (c *certificateV1) PublicKeyPem() []byte {
86+
func (c *certificateV1) PublicKeyPEM() []byte {
8787
return marshalCertPublicKeyToPEM(c)
8888
}
8989

cert/cert_v1_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ func TestCertificateV1_PublicKeyPem(t *testing.T) {
8686
assert.Equal(t, Version1, nc.Version())
8787
assert.Equal(t, Curve_CURVE25519, nc.Curve())
8888
pubPem := "-----BEGIN NEBULA X25519 PUBLIC KEY-----\nMTIzNDU2Nzg5MGFiY2VkZmdoaWoxMjM0NTY3ODkwYWI=\n-----END NEBULA X25519 PUBLIC KEY-----\n"
89-
assert.Equal(t, string(nc.PublicKeyPem()), pubPem)
89+
assert.Equal(t, string(nc.PublicKeyPEM()), pubPem)
9090
assert.False(t, nc.IsCA())
9191

9292
nc.details.isCA = true
9393
assert.Equal(t, Curve_CURVE25519, nc.Curve())
9494
pubPem = "-----BEGIN NEBULA ED25519 PUBLIC KEY-----\nMTIzNDU2Nzg5MGFiY2VkZmdoaWoxMjM0NTY3ODkwYWI=\n-----END NEBULA ED25519 PUBLIC KEY-----\n"
95-
assert.Equal(t, string(nc.PublicKeyPem()), pubPem)
95+
assert.Equal(t, string(nc.PublicKeyPEM()), pubPem)
9696
assert.True(t, nc.IsCA())
9797

9898
pubP256KeyPem := []byte(`-----BEGIN NEBULA P256 PUBLIC KEY-----
@@ -105,12 +105,12 @@ AAAAAAAAAAAAAAAAAAAAAAA=
105105
nc.details.curve = Curve_P256
106106
nc.details.publicKey = pubP256Key
107107
assert.Equal(t, Curve_P256, nc.Curve())
108-
assert.Equal(t, string(nc.PublicKeyPem()), string(pubP256KeyPem))
108+
assert.Equal(t, string(nc.PublicKeyPEM()), string(pubP256KeyPem))
109109
assert.True(t, nc.IsCA())
110110

111111
nc.details.isCA = false
112112
assert.Equal(t, Curve_P256, nc.Curve())
113-
assert.Equal(t, string(nc.PublicKeyPem()), string(pubP256KeyPem))
113+
assert.Equal(t, string(nc.PublicKeyPEM()), string(pubP256KeyPem))
114114
assert.False(t, nc.IsCA())
115115
}
116116

cert/cert_v2.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func (c *certificateV2) PublicKey() []byte {
114114
return c.publicKey
115115
}
116116

117-
func (c *certificateV2) PublicKeyPem() []byte {
117+
func (c *certificateV2) PublicKeyPEM() []byte {
118118
return marshalCertPublicKeyToPEM(c)
119119
}
120120

cert/cert_v2_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,13 @@ func TestCertificateV2_PublicKeyPem(t *testing.T) {
100100
assert.Equal(t, Version2, nc.Version())
101101
assert.Equal(t, Curve_CURVE25519, nc.Curve())
102102
pubPem := "-----BEGIN NEBULA X25519 PUBLIC KEY-----\nMTIzNDU2Nzg5MGFiY2VkZmdoaWoxMjM0NTY3ODkwYWI=\n-----END NEBULA X25519 PUBLIC KEY-----\n"
103-
assert.Equal(t, string(nc.PublicKeyPem()), pubPem)
103+
assert.Equal(t, string(nc.PublicKeyPEM()), pubPem)
104104
assert.False(t, nc.IsCA())
105105

106106
nc.details.isCA = true
107107
assert.Equal(t, Curve_CURVE25519, nc.Curve())
108108
pubPem = "-----BEGIN NEBULA ED25519 PUBLIC KEY-----\nMTIzNDU2Nzg5MGFiY2VkZmdoaWoxMjM0NTY3ODkwYWI=\n-----END NEBULA ED25519 PUBLIC KEY-----\n"
109-
assert.Equal(t, string(nc.PublicKeyPem()), pubPem)
109+
assert.Equal(t, string(nc.PublicKeyPEM()), pubPem)
110110
assert.True(t, nc.IsCA())
111111

112112
pubP256KeyPem := []byte(`-----BEGIN NEBULA P256 PUBLIC KEY-----
@@ -119,12 +119,12 @@ AAAAAAAAAAAAAAAAAAAAAAA=
119119
nc.curve = Curve_P256
120120
nc.publicKey = pubP256Key
121121
assert.Equal(t, Curve_P256, nc.Curve())
122-
assert.Equal(t, string(nc.PublicKeyPem()), string(pubP256KeyPem))
122+
assert.Equal(t, string(nc.PublicKeyPEM()), string(pubP256KeyPem))
123123
assert.True(t, nc.IsCA())
124124

125125
nc.details.isCA = false
126126
assert.Equal(t, Curve_P256, nc.Curve())
127-
assert.Equal(t, string(nc.PublicKeyPem()), string(pubP256KeyPem))
127+
assert.Equal(t, string(nc.PublicKeyPEM()), string(pubP256KeyPem))
128128
assert.False(t, nc.IsCA())
129129
}
130130

cert/pem.go

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,26 @@ import (
77
"golang.org/x/crypto/ed25519"
88
)
99

10-
const (
11-
CertificateBanner = "NEBULA CERTIFICATE"
12-
CertificateV2Banner = "NEBULA CERTIFICATE V2"
13-
X25519PrivateKeyBanner = "NEBULA X25519 PRIVATE KEY"
14-
X25519PublicKeyBanner = "NEBULA X25519 PUBLIC KEY"
15-
EncryptedEd25519PrivateKeyBanner = "NEBULA ED25519 ENCRYPTED PRIVATE KEY"
16-
Ed25519PrivateKeyBanner = "NEBULA ED25519 PRIVATE KEY"
17-
Ed25519PublicKeyBanner = "NEBULA ED25519 PUBLIC KEY"
18-
19-
P256PrivateKeyBanner = "NEBULA P256 PRIVATE KEY"
20-
P256PublicKeyBanner = "NEBULA P256 PUBLIC KEY"
10+
const ( //cert banners
11+
CertificateBanner = "NEBULA CERTIFICATE"
12+
CertificateV2Banner = "NEBULA CERTIFICATE V2"
13+
)
14+
15+
const ( //key-agreement-key banners
16+
X25519PrivateKeyBanner = "NEBULA X25519 PRIVATE KEY"
17+
X25519PublicKeyBanner = "NEBULA X25519 PUBLIC KEY"
18+
P256PrivateKeyBanner = "NEBULA P256 PRIVATE KEY"
19+
P256PublicKeyBanner = "NEBULA P256 PUBLIC KEY"
20+
)
21+
22+
/* including "ECDSA" in the P256 banners is a clue that these keys should be used only for signing */
23+
const ( //signing key banners
2124
EncryptedECDSAP256PrivateKeyBanner = "NEBULA ECDSA P256 ENCRYPTED PRIVATE KEY"
2225
ECDSAP256PrivateKeyBanner = "NEBULA ECDSA P256 PRIVATE KEY"
23-
24-
// Deprecated: oldP256PublicKeyBanner is in use some places still
25-
oldP256PublicKeyBanner = "NEBULA ECDSA P256 PUBLIC KEY"
26+
ECDSAP256PublicKeyBanner = "NEBULA ECDSA P256 PUBLIC KEY"
27+
EncryptedEd25519PrivateKeyBanner = "NEBULA ED25519 ENCRYPTED PRIVATE KEY"
28+
Ed25519PrivateKeyBanner = "NEBULA ED25519 PRIVATE KEY"
29+
Ed25519PublicKeyBanner = "NEBULA ED25519 PUBLIC KEY"
2630
)
2731

2832
// UnmarshalCertificateFromPEM will try to unmarshal the first pem block in a byte array, returning any non consumed
@@ -55,24 +59,32 @@ func UnmarshalCertificateFromPEM(b []byte) (Certificate, []byte, error) {
5559
}
5660

5761
func marshalCertPublicKeyToPEM(c Certificate) []byte {
58-
switch c.Curve() {
62+
if c.IsCA() {
63+
return MarshalSigningPublicKeyToPEM(c.Curve(), c.PublicKey())
64+
} else {
65+
return MarshalPublicKeyToPEM(c.Curve(), c.PublicKey())
66+
}
67+
}
68+
69+
// MarshalPublicKeyToPEM returns a PEM representation of a public key used for ECDH.
70+
// if your public key came from a certificate, prefer Certificate.PublicKeyPEM() if possible, to avoid mistakes!
71+
func MarshalPublicKeyToPEM(curve Curve, b []byte) []byte {
72+
switch curve {
5973
case Curve_CURVE25519:
60-
if c.IsCA() {
61-
return pem.EncodeToMemory(&pem.Block{Type: Ed25519PublicKeyBanner, Bytes: c.PublicKey()})
62-
} else {
63-
return pem.EncodeToMemory(&pem.Block{Type: X25519PublicKeyBanner, Bytes: c.PublicKey()})
64-
}
74+
return pem.EncodeToMemory(&pem.Block{Type: X25519PublicKeyBanner, Bytes: b})
6575
case Curve_P256:
66-
return MarshalPublicKeyToPEM(Curve_P256, c.PublicKey())
76+
return pem.EncodeToMemory(&pem.Block{Type: P256PublicKeyBanner, Bytes: b})
6777
default:
6878
return nil
6979
}
7080
}
7181

72-
func MarshalPublicKeyToPEM(curve Curve, b []byte) []byte {
82+
// MarshalSigningPublicKeyToPEM returns a PEM representation of a public key used for signing.
83+
// if your public key came from a certificate, prefer Certificate.PublicKeyPEM() if possible, to avoid mistakes!
84+
func MarshalSigningPublicKeyToPEM(curve Curve, b []byte) []byte {
7385
switch curve {
7486
case Curve_CURVE25519:
75-
return pem.EncodeToMemory(&pem.Block{Type: X25519PublicKeyBanner, Bytes: b})
87+
return pem.EncodeToMemory(&pem.Block{Type: Ed25519PublicKeyBanner, Bytes: b})
7688
case Curve_P256:
7789
return pem.EncodeToMemory(&pem.Block{Type: P256PublicKeyBanner, Bytes: b})
7890
default:
@@ -91,7 +103,7 @@ func UnmarshalPublicKeyFromPEM(b []byte) ([]byte, []byte, Curve, error) {
91103
case X25519PublicKeyBanner, Ed25519PublicKeyBanner:
92104
expectedLen = 32
93105
curve = Curve_CURVE25519
94-
case P256PublicKeyBanner, oldP256PublicKeyBanner:
106+
case P256PublicKeyBanner, ECDSAP256PublicKeyBanner:
95107
// Uncompressed
96108
expectedLen = 65
97109
curve = Curve_P256

connection_manager_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ func (d *dummyCert) PublicKey() []byte {
446446
return d.publicKey
447447
}
448448

449-
func (d *dummyCert) PublicKeyPem() []byte {
449+
func (d *dummyCert) PublicKeyPEM() []byte {
450450
return cert.MarshalPublicKeyToPEM(d.curve, d.publicKey)
451451
}
452452

0 commit comments

Comments
 (0)