Commit 59a92cde authored by Dave Cheney's avatar Dave Cheney Committed by Adam Langley

exp/ssh: use ClientConfig.rand() for publickey authentication

Closes TODO from 5373055

R=agl
CC=golang-dev
https://golang.org/cl/5375081
parent 3ee171d1
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
package ssh package ssh
import ( import (
"crypto/rand"
"errors" "errors"
"io" "io"
) )
...@@ -28,7 +27,7 @@ func (c *ClientConn) authenticate(session []byte) error { ...@@ -28,7 +27,7 @@ func (c *ClientConn) authenticate(session []byte) error {
// then any untried methods suggested by the server. // then any untried methods suggested by the server.
tried, remain := make(map[string]bool), make(map[string]bool) tried, remain := make(map[string]bool), make(map[string]bool)
for auth := ClientAuth(new(noneAuth)); auth != nil; { for auth := ClientAuth(new(noneAuth)); auth != nil; {
ok, methods, err := auth.auth(session, c.config.User, c.transport) ok, methods, err := auth.auth(session, c.config.User, c.transport, c.config.rand())
if err != nil { if err != nil {
return err return err
} }
...@@ -62,7 +61,7 @@ type ClientAuth interface { ...@@ -62,7 +61,7 @@ type ClientAuth interface {
// Returns true if authentication is successful. // Returns true if authentication is successful.
// If authentication is not successful, a []string of alternative // If authentication is not successful, a []string of alternative
// method names is returned. // method names is returned.
auth(session []byte, user string, t *transport) (bool, []string, error) auth(session []byte, user string, t *transport, rand io.Reader) (bool, []string, error)
// method returns the RFC 4252 method name. // method returns the RFC 4252 method name.
method() string method() string
...@@ -71,7 +70,7 @@ type ClientAuth interface { ...@@ -71,7 +70,7 @@ type ClientAuth interface {
// "none" authentication, RFC 4252 section 5.2. // "none" authentication, RFC 4252 section 5.2.
type noneAuth int type noneAuth int
func (n *noneAuth) auth(session []byte, user string, t *transport) (bool, []string, error) { func (n *noneAuth) auth(session []byte, user string, t *transport, rand io.Reader) (bool, []string, error) {
if err := t.writePacket(marshal(msgUserAuthRequest, userAuthRequestMsg{ if err := t.writePacket(marshal(msgUserAuthRequest, userAuthRequestMsg{
User: user, User: user,
Service: serviceSSH, Service: serviceSSH,
...@@ -104,7 +103,7 @@ type passwordAuth struct { ...@@ -104,7 +103,7 @@ type passwordAuth struct {
ClientPassword ClientPassword
} }
func (p *passwordAuth) auth(session []byte, user string, t *transport) (bool, []string, error) { func (p *passwordAuth) auth(session []byte, user string, t *transport, rand io.Reader) (bool, []string, error) {
type passwordAuthMsg struct { type passwordAuthMsg struct {
User string User string
Service string Service string
...@@ -174,7 +173,7 @@ type publickeyAuth struct { ...@@ -174,7 +173,7 @@ type publickeyAuth struct {
ClientKeyring ClientKeyring
} }
func (p *publickeyAuth) auth(session []byte, user string, t *transport) (bool, []string, error) { func (p *publickeyAuth) auth(session []byte, user string, t *transport, rand io.Reader) (bool, []string, error) {
type publickeyAuthMsg struct { type publickeyAuthMsg struct {
User string User string
Service string Service string
...@@ -241,8 +240,7 @@ func (p *publickeyAuth) auth(session []byte, user string, t *transport) (bool, [ ...@@ -241,8 +240,7 @@ func (p *publickeyAuth) auth(session []byte, user string, t *transport) (bool, [
for i, key := range validKeys { for i, key := range validKeys {
pubkey := serializePublickey(key) pubkey := serializePublickey(key)
algoname := algoName(key) algoname := algoName(key)
// TODO(dfc) use random source from the ClientConfig sign, err := p.Sign(i, rand, buildDataSignedForAuth(session, userAuthRequestMsg{
sign, err := p.Sign(i, rand.Reader, buildDataSignedForAuth(session, userAuthRequestMsg{
User: user, User: user,
Service: serviceSSH, Service: serviceSSH,
Method: p.method(), Method: p.method(),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment