WithNebulaCert returns a Options that sets the nebula header.
(certFile string, anyKey any)
| 259 | |
| 260 | // WithNebulaCert returns a Options that sets the nebula header. |
| 261 | func WithNebulaCert(certFile string, anyKey any) Options { |
| 262 | return func(c *Claims) error { |
| 263 | b, err := os.ReadFile(certFile) |
| 264 | if err != nil { |
| 265 | return errors.Wrapf(err, "error reading %s", certFile) |
| 266 | } |
| 267 | |
| 268 | blockType := nebula.CertificateBanner // default to a v1 Nebula certificate |
| 269 | if bytes.HasPrefix(b, pemCertPrefix) { |
| 270 | block, _ := pem.Decode(b) |
| 271 | if block == nil || (block.Type != nebula.CertificateBanner && block.Type != nebula.CertificateV2Banner) { |
| 272 | return errors.Errorf("error reading %s: not a proper nebula certificate", certFile) |
| 273 | } |
| 274 | b = block.Bytes |
| 275 | blockType = block.Type |
| 276 | } |
| 277 | |
| 278 | pemData := pem.EncodeToMemory(&pem.Block{Type: blockType, Bytes: b}) |
| 279 | crt, _, err := nebula.UnmarshalCertificateFromPEM(pemData) |
| 280 | if err != nil { |
| 281 | return errors.Wrapf(err, "error reading %s", certFile) |
| 282 | } |
| 283 | |
| 284 | var key []byte |
| 285 | var curve nebula.Curve |
| 286 | switch k := anyKey.(type) { |
| 287 | case x25519.PrivateKey: |
| 288 | key = []byte(k) |
| 289 | curve = nebula.Curve_CURVE25519 |
| 290 | case ed25519.PrivateKey: |
| 291 | key = []byte(k) |
| 292 | curve = nebula.Curve_CURVE25519 |
| 293 | case []byte: |
| 294 | key = k |
| 295 | curve = nebula.Curve_CURVE25519 |
| 296 | case *ecdsa.PrivateKey: |
| 297 | pk, err := k.ECDH() |
| 298 | if err != nil { |
| 299 | return fmt.Errorf("failed transforming to ECDH key: %w", err) |
| 300 | } |
| 301 | key = pk.Bytes() |
| 302 | curve = nebula.Curve_P256 |
| 303 | case *ecdh.PrivateKey: |
| 304 | key = k.Bytes() |
| 305 | curve = nebula.Curve_P256 |
| 306 | default: |
| 307 | return errors.Errorf("key content is not a valid nebula key; got type %T", anyKey) |
| 308 | } |
| 309 | |
| 310 | if err := crt.VerifyPrivateKey(curve, key); err != nil { |
| 311 | return errors.Wrapf(err, "error validating %s", certFile) |
| 312 | } |
| 313 | |
| 314 | c.SetHeader("nebula", b) |
| 315 | return nil |
| 316 | } |
| 317 | } |
| 318 |
searching dependent graphs…