1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- package noiseutil
- import (
- "crypto/ecdh"
- "fmt"
- "strings"
- "github.com/slackhq/nebula/pkclient"
- "github.com/flynn/noise"
- )
- // DHP256PKCS11 is the NIST P-256 ECDH function
- var DHP256PKCS11 noise.DHFunc = newNISTP11Curve("P256", ecdh.P256(), 32)
- type nistP11Curve struct {
- nistCurve
- }
- func newNISTP11Curve(name string, curve ecdh.Curve, byteLen int) nistP11Curve {
- return nistP11Curve{
- newNISTCurve(name, curve, byteLen),
- }
- }
- func (c nistP11Curve) DH(privkey, pubkey []byte) ([]byte, error) {
- //for this function "privkey" is actually a pkcs11 URI
- pkStr := string(privkey)
- //to set up a handshake, we need to also do non-pkcs11-DH. Handle that here.
- if !strings.HasPrefix(pkStr, "pkcs11:") {
- return DHP256.DH(privkey, pubkey)
- }
- ecdhPubKey, err := c.curve.NewPublicKey(pubkey)
- if err != nil {
- return nil, fmt.Errorf("unable to unmarshal pubkey: %w", err)
- }
- //this is not the most performant way to do this (a long-lived client would be better)
- //but, it works, and helps avoid problems with stale sessions and HSMs used by multiple users.
- client, err := pkclient.FromUrl(pkStr)
- if err != nil {
- return nil, err
- }
- defer func(client *pkclient.PKClient) {
- _ = client.Close()
- }(client)
- return client.DeriveNoise(ecdhPubKey.Bytes())
- }
|