mirror of
https://github.com/netbirdio/netbird.git
synced 2026-04-16 07:16:38 +00:00
51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
//go:build js
|
|
|
|
package ssh
|
|
|
|
import (
|
|
"crypto/x509"
|
|
"encoding/pem"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
"golang.org/x/crypto/ssh"
|
|
)
|
|
|
|
// parseSSHPrivateKey parses a private key in either SSH or PKCS8 format
|
|
func parseSSHPrivateKey(keyPEM []byte) (ssh.Signer, error) {
|
|
keyStr := string(keyPEM)
|
|
if !strings.Contains(keyStr, "-----BEGIN") {
|
|
keyPEM = []byte("-----BEGIN PRIVATE KEY-----\n" + keyStr + "\n-----END PRIVATE KEY-----")
|
|
}
|
|
|
|
signer, err := ssh.ParsePrivateKey(keyPEM)
|
|
if err == nil {
|
|
return signer, nil
|
|
}
|
|
logrus.Debugf("SSH: Failed to parse as SSH format: %v", err)
|
|
|
|
block, _ := pem.Decode(keyPEM)
|
|
if block == nil {
|
|
keyPreview := string(keyPEM)
|
|
if len(keyPreview) > 100 {
|
|
keyPreview = keyPreview[:100]
|
|
}
|
|
return nil, fmt.Errorf("decode PEM block from key: %s", keyPreview)
|
|
}
|
|
|
|
key, err := x509.ParsePKCS8PrivateKey(block.Bytes)
|
|
if err != nil {
|
|
logrus.Debugf("SSH: Failed to parse as PKCS8: %v", err)
|
|
if rsaKey, err := x509.ParsePKCS1PrivateKey(block.Bytes); err == nil {
|
|
return ssh.NewSignerFromKey(rsaKey)
|
|
}
|
|
if ecKey, err := x509.ParseECPrivateKey(block.Bytes); err == nil {
|
|
return ssh.NewSignerFromKey(ecKey)
|
|
}
|
|
return nil, fmt.Errorf("parse private key: %w", err)
|
|
}
|
|
|
|
return ssh.NewSignerFromKey(key)
|
|
}
|