remove format/openssh.go
this is unnecessary now that x/crypto/ssh.MarshalPrivateKey has been added
This commit is contained in:
parent
b291f63188
commit
fd10a2ad4b
2 changed files with 12 additions and 117 deletions
27
cmd/cmd.go
27
cmd/cmd.go
|
@ -718,39 +718,36 @@ func initializeKeypair() error {
|
||||||
_, err = os.Stat(privKeyPath)
|
_, err = os.Stat(privKeyPath)
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
fmt.Printf("Couldn't find '%s'. Generating new private key.\n", privKeyPath)
|
fmt.Printf("Couldn't find '%s'. Generating new private key.\n", privKeyPath)
|
||||||
_, privKey, err := ed25519.GenerateKey(rand.Reader)
|
cryptoPublicKey, cryptoPrivateKey, err := ed25519.GenerateKey(rand.Reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
privKeyBytes, err := format.OpenSSHPrivateKey(privKey, "")
|
privateKeyBytes, err := ssh.MarshalPrivateKey(cryptoPrivateKey, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = os.MkdirAll(filepath.Dir(privKeyPath), 0o755)
|
if err := os.MkdirAll(filepath.Dir(privKeyPath), 0o755); err != nil {
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("could not create directory %w", err)
|
return fmt.Errorf("could not create directory %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = os.WriteFile(privKeyPath, pem.EncodeToMemory(privKeyBytes), 0o600)
|
if err := os.WriteFile(privKeyPath, pem.EncodeToMemory(privateKeyBytes), 0o600); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
sshPublicKey, err := ssh.NewPublicKey(cryptoPublicKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
sshPrivateKey, err := ssh.NewSignerFromKey(privKey)
|
publicKeyBytes := ssh.MarshalAuthorizedKey(sshPublicKey)
|
||||||
if err != nil {
|
|
||||||
|
if err := os.WriteFile(pubKeyPath, publicKeyBytes, 0o644); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
pubKeyData := ssh.MarshalAuthorizedKey(sshPrivateKey.PublicKey())
|
fmt.Printf("Your new public key is: \n\n%s\n", publicKeyBytes)
|
||||||
|
|
||||||
err = os.WriteFile(pubKeyPath, pubKeyData, 0o644)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("Your new public key is: \n\n%s\n", string(pubKeyData))
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,102 +0,0 @@
|
||||||
// Copyright 2012 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Code originally from https://go-review.googlesource.com/c/crypto/+/218620
|
|
||||||
|
|
||||||
// TODO: replace with upstream once the above change is merged and released.
|
|
||||||
|
|
||||||
package format
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto"
|
|
||||||
"crypto/ed25519"
|
|
||||||
"crypto/rand"
|
|
||||||
"encoding/binary"
|
|
||||||
"encoding/pem"
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"golang.org/x/crypto/ssh"
|
|
||||||
)
|
|
||||||
|
|
||||||
const privateKeyAuthMagic = "openssh-key-v1\x00"
|
|
||||||
|
|
||||||
type openSSHEncryptedPrivateKey struct {
|
|
||||||
CipherName string
|
|
||||||
KDFName string
|
|
||||||
KDFOptions string
|
|
||||||
KeysCount uint32
|
|
||||||
PubKey []byte
|
|
||||||
KeyBlocks []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
type openSSHPrivateKey struct {
|
|
||||||
Check1 uint32
|
|
||||||
Check2 uint32
|
|
||||||
Keytype string
|
|
||||||
Rest []byte `ssh:"rest"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type openSSHEd25519PrivateKey struct {
|
|
||||||
Pub []byte
|
|
||||||
Priv []byte
|
|
||||||
Comment string
|
|
||||||
Pad []byte `ssh:"rest"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func OpenSSHPrivateKey(key crypto.PrivateKey, comment string) (*pem.Block, error) {
|
|
||||||
var check uint32
|
|
||||||
if err := binary.Read(rand.Reader, binary.BigEndian, &check); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var pk1 openSSHPrivateKey
|
|
||||||
pk1.Check1 = check
|
|
||||||
pk1.Check2 = check
|
|
||||||
|
|
||||||
var w openSSHEncryptedPrivateKey
|
|
||||||
w.KeysCount = 1
|
|
||||||
|
|
||||||
if k, ok := key.(*ed25519.PrivateKey); ok {
|
|
||||||
key = *k
|
|
||||||
}
|
|
||||||
|
|
||||||
switch k := key.(type) {
|
|
||||||
case ed25519.PrivateKey:
|
|
||||||
pub, priv := k[32:], k
|
|
||||||
key := openSSHEd25519PrivateKey{
|
|
||||||
Pub: pub,
|
|
||||||
Priv: priv,
|
|
||||||
Comment: comment,
|
|
||||||
}
|
|
||||||
|
|
||||||
pk1.Keytype = ssh.KeyAlgoED25519
|
|
||||||
pk1.Rest = ssh.Marshal(key)
|
|
||||||
|
|
||||||
w.PubKey = ssh.Marshal(struct {
|
|
||||||
KeyType string
|
|
||||||
Pub []byte
|
|
||||||
}{
|
|
||||||
ssh.KeyAlgoED25519, pub,
|
|
||||||
})
|
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("ssh: unknown key type %T", k)
|
|
||||||
}
|
|
||||||
|
|
||||||
w.KeyBlocks = openSSHPadding(ssh.Marshal(pk1), 8)
|
|
||||||
|
|
||||||
w.CipherName, w.KDFName, w.KDFOptions = "none", "none", ""
|
|
||||||
|
|
||||||
return &pem.Block{
|
|
||||||
Type: "OPENSSH PRIVATE KEY",
|
|
||||||
Bytes: append([]byte(privateKeyAuthMagic), ssh.Marshal(w)...),
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func openSSHPadding(block []byte, blocksize int) []byte {
|
|
||||||
for i, j := 0, len(block); (j+i)%blocksize != 0; i++ {
|
|
||||||
block = append(block, byte(i+1))
|
|
||||||
}
|
|
||||||
|
|
||||||
return block
|
|
||||||
}
|
|
Loading…
Reference in a new issue