@@ -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
5761func 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
0 commit comments