go.crypto/ssh: Add support for ECDSA keys and certs.
R=agl, dave
CC=golang-dev
https://golang.org/cl/6873060
diff --git a/ssh/common.go b/ssh/common.go
index 8709d2a..82b2f25 100644
--- a/ssh/common.go
+++ b/ssh/common.go
@@ -6,6 +6,7 @@
import (
"crypto/dsa"
+ "crypto/ecdsa"
"crypto/rsa"
"errors"
"fmt"
@@ -191,11 +192,17 @@
switch algoname {
// The corresponding private key to a public certificate is always a normal
// private key. For signature serialization purposes, ensure we use the
- // proper ssh-rsa or ssh-dss algo name in case the public cert algo name is passed.
- case hostAlgoRSACertV01:
+ // proper key algorithm name in case the public cert algorithm name is passed.
+ case certAlgoRSAv01:
algoname = "ssh-rsa"
- case hostAlgoDSACertV01:
+ case certAlgoDSAv01:
algoname = "ssh-dss"
+ case certAlgoECDSA256v01:
+ algoname = "ecdsa-sha2-nistp256"
+ case certAlgoECDSA384v01:
+ algoname = "ecdsa-sha2-nistp384"
+ case certAlgoECDSA521v01:
+ algoname = "ecdsa-sha2-nistp521"
}
length := stringLength(len(algoname))
length += stringLength(len(sig))
@@ -216,6 +223,8 @@
pubKeyBytes = marshalPubRSA(key)
case *dsa.PublicKey:
pubKeyBytes = marshalPubDSA(key)
+ case *ecdsa.PublicKey:
+ pubKeyBytes = marshalPubECDSA(key)
case *OpenSSHCertV01:
pubKeyBytes = marshalOpenSSHCertV01(key)
default:
@@ -236,6 +245,15 @@
return "ssh-rsa"
case *dsa.PublicKey:
return "ssh-dss"
+ case *ecdsa.PublicKey:
+ switch key.(*ecdsa.PublicKey).Params().BitSize {
+ case 256:
+ return "ecdsa-sha2-nistp256"
+ case 384:
+ return "ecdsa-sha2-nistp384"
+ case 521:
+ return "ecdsa-sha2-nistp521"
+ }
case *OpenSSHCertV01:
return algoName(key.(*OpenSSHCertV01).Key) + "-cert-v01@openssh.com"
}