go.crypto/ssh: Miscellaneous changes up for discussion.
Export key and certificate algorithm names.
Switch from string literals over to using the constants for any key/cert algorithm references.
Make URL references visible in the godoc web display.
Standardize url reference names with surrounding [].

R=dave, agl, jonathan.mark.pittman
CC=golang-dev
https://golang.org/cl/6944047
diff --git a/ssh/agent.go b/ssh/agent.go
index 28d52df..3bef382 100644
--- a/ssh/agent.go
+++ b/ssh/agent.go
@@ -4,9 +4,6 @@
 
 package ssh
 
-// References
-//   PROTOCOL.agent: http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.agent
-
 import (
 	"encoding/base64"
 	"errors"
@@ -14,7 +11,7 @@
 	"sync"
 )
 
-// See PROTOCOL.agent, section 3.
+// See [PROTOCOL.agent], section 3.
 const (
 	// 3.2 Requests from client to agent for protocol 2 key operations
 	agentRequestIdentities   = 11
@@ -50,34 +47,34 @@
 
 // Agent messages:
 // These structures mirror the wire format of the corresponding ssh agent
-// messages found in PROTOCOL.agent.
+// messages found in [PROTOCOL.agent].
 
 type failureAgentMsg struct{}
 
 type successAgentMsg struct{}
 
-// See PROTOCOL.agent, section 2.5.2.
+// See [PROTOCOL.agent], section 2.5.2.
 type requestIdentitiesAgentMsg struct{}
 
-// See PROTOCOL.agent, section 2.5.2.
+// See [PROTOCOL.agent], section 2.5.2.
 type identitiesAnswerAgentMsg struct {
 	NumKeys uint32
 	Keys    []byte `ssh:"rest"`
 }
 
-// See PROTOCOL.agent, section 2.6.2.
+// See [PROTOCOL.agent], section 2.6.2.
 type signRequestAgentMsg struct {
 	KeyBlob []byte
 	Data    []byte
 	Flags   uint32
 }
 
-// See PROTOCOL.agent, section 2.6.2.
+// See [PROTOCOL.agent], section 2.6.2.
 type signResponseAgentMsg struct {
 	SigBlob []byte
 }
 
-// AgentKey represents a protocol 2 key as defined in PROTOCOL.agent,
+// AgentKey represents a protocol 2 key as defined in [PROTOCOL.agent],
 // section 2.5.2.
 type AgentKey struct {
 	blob    []byte
@@ -127,7 +124,7 @@
 }
 
 // AgentClient provides a means to communicate with an ssh agent process based
-// on the protocol described in PROTOCOL.agent?rev=1.6.
+// on the protocol described in [PROTOCOL.agent]?rev=1.6.
 type AgentClient struct {
 	// conn is typically represented by using a *net.UnixConn
 	conn io.ReadWriter
@@ -175,7 +172,7 @@
 }
 
 // RequestIdentities queries the agent for protocol 2 keys as defined in
-// PROTOCOL.agent section 2.5.2.
+// [PROTOCOL.agent] section 2.5.2.
 func (ac *AgentClient) RequestIdentities() ([]*AgentKey, error) {
 	req := marshal(agentRequestIdentities, requestIdentitiesAgentMsg{})
 
@@ -207,7 +204,7 @@
 }
 
 // SignRequest requests the signing of data by the agent using a protocol 2 key
-// as defined in PROTOCOL.agent section 2.6.2.  Supported key types include
+// as defined in [PROTOCOL.agent] section 2.6.2.  Supported key types include
 // *rsa.PublicKey, *dsa.PublicKey, *OpenSSHCertV01.
 func (ac *AgentClient) SignRequest(key interface{}, data []byte) ([]byte, error) {
 	req := marshal(agentSignRequest, signRequestAgentMsg{
diff --git a/ssh/certs.go b/ssh/certs.go
index eeaef31..4ef7103 100644
--- a/ssh/certs.go
+++ b/ssh/certs.go
@@ -4,9 +4,6 @@
 
 package ssh
 
-// References
-//   [PROTOCOL.certkeys]: http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys
-
 import (
 	"crypto/dsa"
 	"crypto/ecdsa"
@@ -16,11 +13,11 @@
 
 // String constants in [PROTOCOL.certkeys] for certificate algorithm names.
 const (
-	certAlgoRSAv01      = "ssh-rsa-cert-v01@openssh.com"
-	certAlgoDSAv01      = "ssh-dss-cert-v01@openssh.com"
-	certAlgoECDSA256v01 = "ecdsa-sha2-nistp256-cert-v01@openssh.com"
-	certAlgoECDSA384v01 = "ecdsa-sha2-nistp384-cert-v01@openssh.com"
-	certAlgoECDSA521v01 = "ecdsa-sha2-nistp521-cert-v01@openssh.com"
+	CertAlgoRSAv01      = "ssh-rsa-cert-v01@openssh.com"
+	CertAlgoDSAv01      = "ssh-dss-cert-v01@openssh.com"
+	CertAlgoECDSA256v01 = "ecdsa-sha2-nistp256-cert-v01@openssh.com"
+	CertAlgoECDSA384v01 = "ecdsa-sha2-nistp384-cert-v01@openssh.com"
+	CertAlgoECDSA521v01 = "ecdsa-sha2-nistp521-cert-v01@openssh.com"
 )
 
 // Certificate types are used to specify whether a certificate is for identification
@@ -41,10 +38,7 @@
 }
 
 // An OpenSSHCertV01 represents an OpenSSH certificate as defined in
-// [PROTOCOL.certkeys] rev 1.8. Supported formats include
-// ssh-rsa-cert-v01@openssh.com, ssh-dss-cert-v01@openssh.com,
-// ecdsa-sha2-nistp256-cert-v01@openssh.com, ecdsa-sha2-nistp384-cert-v01@openssh.com,
-// and ecdsa-sha2-nistp521-cert-v01@openssh.com.
+// [PROTOCOL.certkeys]?rev=1.8.
 type OpenSSHCertV01 struct {
 	Nonce                   []byte
 	Key                     interface{} // rsa, dsa, or ecdsa *PublicKey
@@ -68,19 +62,19 @@
 	}
 
 	switch algo {
-	case certAlgoRSAv01:
+	case CertAlgoRSAv01:
 		var rsaPubKey *rsa.PublicKey
 		if rsaPubKey, in, ok = parseRSA(in); !ok {
 			return
 		}
 		cert.Key = rsaPubKey
-	case certAlgoDSAv01:
+	case CertAlgoDSAv01:
 		var dsaPubKey *dsa.PublicKey
 		if dsaPubKey, in, ok = parseDSA(in); !ok {
 			return
 		}
 		cert.Key = dsaPubKey
-	case certAlgoECDSA256v01, certAlgoECDSA384v01, certAlgoECDSA521v01:
+	case CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01:
 		var ecdsaPubKey *ecdsa.PublicKey
 		if ecdsaPubKey, in, ok = parseECDSA(in); !ok {
 			return
diff --git a/ssh/common.go b/ssh/common.go
index 82b2f25..e03a2b3 100644
--- a/ssh/common.go
+++ b/ssh/common.go
@@ -193,16 +193,16 @@
 	// The corresponding private key to a public certificate is always a normal
 	// private key.  For signature serialization purposes, ensure we use the
 	// proper key algorithm name in case the public cert algorithm name is passed.
-	case certAlgoRSAv01:
-		algoname = "ssh-rsa"
-	case certAlgoDSAv01:
-		algoname = "ssh-dss"
-	case certAlgoECDSA256v01:
-		algoname = "ecdsa-sha2-nistp256"
-	case certAlgoECDSA384v01:
-		algoname = "ecdsa-sha2-nistp384"
-	case certAlgoECDSA521v01:
-		algoname = "ecdsa-sha2-nistp521"
+	case CertAlgoRSAv01:
+		algoname = KeyAlgoRSA
+	case CertAlgoDSAv01:
+		algoname = KeyAlgoDSA
+	case CertAlgoECDSA256v01:
+		algoname = KeyAlgoECDSA256
+	case CertAlgoECDSA384v01:
+		algoname = KeyAlgoECDSA384
+	case CertAlgoECDSA521v01:
+		algoname = KeyAlgoECDSA521
 	}
 	length := stringLength(len(algoname))
 	length += stringLength(len(sig))
@@ -242,17 +242,17 @@
 func algoName(key interface{}) string {
 	switch key.(type) {
 	case *rsa.PublicKey:
-		return "ssh-rsa"
+		return KeyAlgoRSA
 	case *dsa.PublicKey:
-		return "ssh-dss"
+		return KeyAlgoDSA
 	case *ecdsa.PublicKey:
 		switch key.(*ecdsa.PublicKey).Params().BitSize {
 		case 256:
-			return "ecdsa-sha2-nistp256"
+			return KeyAlgoECDSA256
 		case 384:
-			return "ecdsa-sha2-nistp384"
+			return KeyAlgoECDSA384
 		case 521:
-			return "ecdsa-sha2-nistp521"
+			return KeyAlgoECDSA521
 		}
 	case *OpenSSHCertV01:
 		return algoName(key.(*OpenSSHCertV01).Key) + "-cert-v01@openssh.com"
diff --git a/ssh/doc.go b/ssh/doc.go
index 8880656..22ff338 100644
--- a/ssh/doc.go
+++ b/ssh/doc.go
@@ -10,5 +10,10 @@
 protocol is a remote shell and this is specifically implemented.  However,
 the multiplexed nature of SSH is exposed to users that wish to support
 others.
+
+References:
+  [PROTOCOL.certkeys]: http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys
+  [PROTOCOL.agent]:    http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.agent
+  [SSH-PARAMETERS]:    http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1
 */
 package ssh
diff --git a/ssh/keys.go b/ssh/keys.go
index bc3e2cb..7a7d0a3 100644
--- a/ssh/keys.go
+++ b/ssh/keys.go
@@ -16,11 +16,11 @@
 
 // Key types supported by OpenSSH 5.9
 const (
-	keyAlgoRSA      = "ssh-rsa"
-	keyAlgoDSA      = "ssh-dss"
-	keyAlgoECDSA256 = "ecdsa-sha2-nistp256"
-	keyAlgoECDSA384 = "ecdsa-sha2-nistp384"
-	keyAlgoECDSA521 = "ecdsa-sha2-nistp521"
+	KeyAlgoRSA      = "ssh-rsa"
+	KeyAlgoDSA      = "ssh-dss"
+	KeyAlgoECDSA256 = "ecdsa-sha2-nistp256"
+	KeyAlgoECDSA384 = "ecdsa-sha2-nistp384"
+	KeyAlgoECDSA521 = "ecdsa-sha2-nistp521"
 )
 
 // parsePubKey parses a public key according to RFC 4253, section 6.6.
@@ -31,13 +31,13 @@
 	}
 
 	switch string(algo) {
-	case keyAlgoRSA:
+	case KeyAlgoRSA:
 		return parseRSA(in)
-	case keyAlgoDSA:
+	case KeyAlgoDSA:
 		return parseDSA(in)
-	case keyAlgoECDSA256, keyAlgoECDSA384, keyAlgoECDSA521:
+	case KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521:
 		return parseECDSA(in)
-	case certAlgoRSAv01, certAlgoDSAv01, certAlgoECDSA256v01, certAlgoECDSA384v01, certAlgoECDSA521v01:
+	case CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01:
 		return parseOpenSSHCertV01(in, string(algo))
 	}
 	panic("ssh: unknown public key type")
@@ -127,12 +127,12 @@
 // marshalPrivRSA serializes an RSA private key according to RFC 4253, section 6.6.
 func marshalPrivRSA(priv *rsa.PrivateKey) []byte {
 	e := new(big.Int).SetInt64(int64(priv.E))
-	length := stringLength(len(keyAlgoRSA))
+	length := stringLength(len(KeyAlgoRSA))
 	length += intLength(e)
 	length += intLength(priv.N)
 
 	ret := make([]byte, length)
-	r := marshalString(ret, []byte(keyAlgoRSA))
+	r := marshalString(ret, []byte(KeyAlgoRSA))
 	r = marshalInt(r, e)
 	r = marshalInt(r, priv.N)
 
@@ -249,17 +249,17 @@
 
 		field := string(in[:i])
 		switch field {
-		case keyAlgoRSA, keyAlgoDSA:
+		case KeyAlgoRSA, KeyAlgoDSA:
 			out, comment, ok = parseAuthorizedKey(in[i:])
 			if ok {
 				return
 			}
-		case keyAlgoECDSA256, keyAlgoECDSA384, keyAlgoECDSA521:
+		case KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521:
 			// We don't support these keys.
 			in = rest
 			continue
-		case certAlgoRSAv01, certAlgoDSAv01,
-			certAlgoECDSA256v01, certAlgoECDSA384v01, certAlgoECDSA521v01:
+		case CertAlgoRSAv01, CertAlgoDSAv01,
+			CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01:
 			// We don't support these certificates.
 			in = rest
 			continue
@@ -304,7 +304,7 @@
 
 		field = string(in[:i])
 		switch field {
-		case keyAlgoRSA, keyAlgoDSA:
+		case KeyAlgoRSA, KeyAlgoDSA:
 			out, comment, ok = parseAuthorizedKey(in[i:])
 			if ok {
 				options = candidateOptions
@@ -332,34 +332,34 @@
 	b := &bytes.Buffer{}
 	switch keyType := key.(type) {
 	case *rsa.PublicKey:
-		b.WriteString(keyAlgoRSA)
+		b.WriteString(KeyAlgoRSA)
 	case *dsa.PublicKey:
-		b.WriteString(keyAlgoDSA)
+		b.WriteString(KeyAlgoDSA)
 	case *ecdsa.PublicKey:
 		switch keyType.Params().BitSize {
 		case 256:
-			b.WriteString(keyAlgoECDSA256)
+			b.WriteString(KeyAlgoECDSA256)
 		case 384:
-			b.WriteString(keyAlgoECDSA384)
+			b.WriteString(KeyAlgoECDSA384)
 		case 521:
-			b.WriteString(keyAlgoECDSA521)
+			b.WriteString(KeyAlgoECDSA521)
 		default:
 			panic("unexpected key type")
 		}
 	case *OpenSSHCertV01:
 		switch keyType.Key.(type) {
 		case *rsa.PublicKey:
-			b.WriteString(certAlgoRSAv01)
+			b.WriteString(CertAlgoRSAv01)
 		case *dsa.PublicKey:
-			b.WriteString(certAlgoDSAv01)
+			b.WriteString(CertAlgoDSAv01)
 		case *ecdsa.PublicKey:
 			switch keyType.Key.(*ecdsa.PublicKey).Params().BitSize {
 			case 256:
-				b.WriteString(certAlgoECDSA256v01)
+				b.WriteString(CertAlgoECDSA256v01)
 			case 384:
-				b.WriteString(certAlgoECDSA384v01)
+				b.WriteString(CertAlgoECDSA384v01)
 			case 521:
-				b.WriteString(certAlgoECDSA521v01)
+				b.WriteString(CertAlgoECDSA521v01)
 			default:
 				panic("unexpected key type")
 			}
diff --git a/ssh/messages.go b/ssh/messages.go
index 34f739c..e199041 100644
--- a/ssh/messages.go
+++ b/ssh/messages.go
@@ -13,8 +13,7 @@
 )
 
 // These are SSH message type numbers. They are scattered around several
-// documents but many were taken from
-// http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1
+// documents but many were taken from [SSH-PARAMETERS].
 const (
 	msgDisconnect     = 1
 	msgIgnore         = 2