diff options
author | Niall Sheridan <nsheridan@gmail.com> | 2016-04-18 22:11:39 +0100 |
---|---|---|
committer | Niall Sheridan <nsheridan@gmail.com> | 2016-04-18 22:11:39 +0100 |
commit | 884013090b1b56b207f644393865c6057c9999ca (patch) | |
tree | 92d94820d0e131bc8385a7ca6540a96336b4e963 /client/keys.go |
Initial commit
Diffstat (limited to 'client/keys.go')
-rw-r--r-- | client/keys.go | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/client/keys.go b/client/keys.go new file mode 100644 index 0000000..4acfbb9 --- /dev/null +++ b/client/keys.go @@ -0,0 +1,64 @@ +package main + +import ( + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/rsa" + "fmt" + + "golang.org/x/crypto/ssh" +) + +const ( + rsaKey = "rsa" + ecdsaKey = "ecdsa" +) + +type key interface{} + +func generateRSAKey(bits int) (*rsa.PrivateKey, ssh.PublicKey, error) { + k, err := rsa.GenerateKey(rand.Reader, bits) + if err != nil { + return nil, nil, err + } + pub, err := ssh.NewPublicKey(&k.PublicKey) + if err != nil { + return nil, nil, err + } + return k, pub, nil +} + +func generateECDSAKey(bits int) (*ecdsa.PrivateKey, ssh.PublicKey, error) { + var curve elliptic.Curve + switch bits { + case 256: + curve = elliptic.P256() + case 384: + curve = elliptic.P384() + case 521: + curve = elliptic.P521() + default: + return nil, nil, fmt.Errorf("Unsupported key size. Valid sizes are '256', '384', '521'") + } + k, err := ecdsa.GenerateKey(curve, rand.Reader) + if err != nil { + return nil, nil, err + } + pub, err := ssh.NewPublicKey(&k.PublicKey) + if err != nil { + return nil, nil, err + } + return k, pub, nil +} + +func generateKey(keytype string, bits int) (key, ssh.PublicKey, error) { + switch keytype { + case rsaKey: + return generateRSAKey(bits) + case ecdsaKey: + return generateECDSAKey(bits) + default: + return nil, nil, fmt.Errorf("Unsupported key type %s. Valid choices are [%s, %s]", keytype, rsaKey, ecdsaKey) + } +} |