@@ -7,19 +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"
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"
2330)
2431
2532// UnmarshalCertificateFromPEM will try to unmarshal the first pem block in a byte array, returning any non consumed
@@ -51,6 +58,16 @@ func UnmarshalCertificateFromPEM(b []byte) (Certificate, []byte, error) {
5158
5259}
5360
61+ func marshalCertPublicKeyToPEM (c Certificate ) []byte {
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!
5471func MarshalPublicKeyToPEM (curve Curve , b []byte ) []byte {
5572 switch curve {
5673 case Curve_CURVE25519 :
@@ -62,6 +79,19 @@ func MarshalPublicKeyToPEM(curve Curve, b []byte) []byte {
6279 }
6380}
6481
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 {
85+ switch curve {
86+ case Curve_CURVE25519 :
87+ return pem .EncodeToMemory (& pem.Block {Type : Ed25519PublicKeyBanner , Bytes : b })
88+ case Curve_P256 :
89+ return pem .EncodeToMemory (& pem.Block {Type : P256PublicKeyBanner , Bytes : b })
90+ default :
91+ return nil
92+ }
93+ }
94+
6595func UnmarshalPublicKeyFromPEM (b []byte ) ([]byte , []byte , Curve , error ) {
6696 k , r := pem .Decode (b )
6797 if k == nil {
@@ -73,7 +103,7 @@ func UnmarshalPublicKeyFromPEM(b []byte) ([]byte, []byte, Curve, error) {
73103 case X25519PublicKeyBanner , Ed25519PublicKeyBanner :
74104 expectedLen = 32
75105 curve = Curve_CURVE25519
76- case P256PublicKeyBanner :
106+ case P256PublicKeyBanner , ECDSAP256PublicKeyBanner :
77107 // Uncompressed
78108 expectedLen = 65
79109 curve = Curve_P256
0 commit comments