mirror of
https://github.com/slackhq/nebula.git
synced 2025-11-22 00:15:37 +01:00
add PKCS11 support (#1153)
* add PKCS11 support * add pkcs11 build option to the makefile, add a stub pkclient to avoid forcing CGO onto people * don't print the pkcs11 option on nebula-cert keygen if not compiled in * remove linux-arm64-pkcs11 from the all target to fix CI * correctly serialize ec keys * nebula-cert: support PKCS#11 for sign and ca * fix gofmt lint * clean up some logic with regard to closing sessions * pkclient: handle empty correctly for TPM2 * Update Makefile and Actions --------- Co-authored-by: Morgan Jones <me@numin.it> Co-authored-by: John Maguire <contact@johnmaguire.me>
This commit is contained in:
50
noiseutil/pkcs11.go
Normal file
50
noiseutil/pkcs11.go
Normal file
@@ -0,0 +1,50 @@
|
||||
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())
|
||||
}
|
||||
Reference in New Issue
Block a user