mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
crypto/tls: simplify keylog tests.
Since there's no aspect of key logging that OpenSSL can check for us, the tests for it might as well just connect to another goroutine as this is lower-maintainance. Change-Id: I746d1dbad1b4bbfc8ef6ccf136ee4824dbda021e Reviewed-on: https://go-review.googlesource.com/30089 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Joonas Kuorilehto <joneskoo@derbian.fi> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
7b40b0c3a3
commit
2878cf14f3
6 changed files with 51 additions and 244 deletions
|
|
@ -728,45 +728,55 @@ func TestLRUClientSessionCache(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestHandshakeClientKeyLog(t *testing.T) {
|
||||
config := testConfig.Clone()
|
||||
buf := &bytes.Buffer{}
|
||||
config.KeyLogWriter = buf
|
||||
func TestKeyLog(t *testing.T) {
|
||||
var serverBuf, clientBuf bytes.Buffer
|
||||
|
||||
// config.Rand is zero reader, so client random is all-0
|
||||
var zeroRandom = strings.Repeat("0", 64)
|
||||
clientConfig := testConfig.Clone()
|
||||
clientConfig.KeyLogWriter = &clientBuf
|
||||
|
||||
test := &clientTest{
|
||||
name: "KeyLogWriter",
|
||||
command: []string{"openssl", "s_server"},
|
||||
config: config,
|
||||
validate: func(state ConnectionState) error {
|
||||
var format, clientRandom, masterSecret string
|
||||
if _, err := fmt.Fscanf(buf, "%s %s %s\n", &format, &clientRandom, &masterSecret); err != nil {
|
||||
return fmt.Errorf("failed to parse KeyLogWriter: " + err.Error())
|
||||
}
|
||||
if format != "CLIENT_RANDOM" {
|
||||
return fmt.Errorf("got key log format %q, wanted CLIENT_RANDOM", format)
|
||||
}
|
||||
if clientRandom != zeroRandom {
|
||||
return fmt.Errorf("got key log client random %q, wanted %q", clientRandom, zeroRandom)
|
||||
}
|
||||
serverConfig := testConfig.Clone()
|
||||
serverConfig.KeyLogWriter = &serverBuf
|
||||
|
||||
// Master secret is random from server; check length only
|
||||
if len(masterSecret) != 96 {
|
||||
return fmt.Errorf("got wrong length master secret in key log %v, want 96", len(masterSecret))
|
||||
}
|
||||
c, s := net.Pipe()
|
||||
done := make(chan bool)
|
||||
|
||||
// buf should contain no more lines
|
||||
var trailingGarbage string
|
||||
if _, err := fmt.Fscanln(buf, &trailingGarbage); err == nil {
|
||||
return fmt.Errorf("expected exactly one key in log, got trailing garbage %q", trailingGarbage)
|
||||
}
|
||||
go func() {
|
||||
defer close(done)
|
||||
|
||||
return nil
|
||||
},
|
||||
if err := Server(s, serverConfig).Handshake(); err != nil {
|
||||
t.Errorf("server: %s", err)
|
||||
return
|
||||
}
|
||||
s.Close()
|
||||
}()
|
||||
|
||||
if err := Client(c, clientConfig).Handshake(); err != nil {
|
||||
t.Fatalf("client: %s", err)
|
||||
}
|
||||
runClientTestTLS10(t, test)
|
||||
|
||||
c.Close()
|
||||
<-done
|
||||
|
||||
checkKeylogLine := func(side, loggedLine string) {
|
||||
if len(loggedLine) == 0 {
|
||||
t.Fatalf("%s: no keylog line was produced", side)
|
||||
}
|
||||
const expectedLen = 13 /* "CLIENT_RANDOM" */ +
|
||||
1 /* space */ +
|
||||
32*2 /* hex client nonce */ +
|
||||
1 /* space */ +
|
||||
48*2 /* hex master secret */ +
|
||||
1 /* new line */
|
||||
if len(loggedLine) != expectedLen {
|
||||
t.Fatalf("%s: keylog line has incorrect length (want %d, got %d): %q", side, expectedLen, len(loggedLine), loggedLine)
|
||||
}
|
||||
if !strings.HasPrefix(loggedLine, "CLIENT_RANDOM "+strings.Repeat("0", 64)+" ") {
|
||||
t.Fatalf("%s: keylog line has incorrect structure or nonce: %q", side, loggedLine)
|
||||
}
|
||||
}
|
||||
|
||||
checkKeylogLine("client", string(clientBuf.Bytes()))
|
||||
checkKeylogLine("server", string(serverBuf.Bytes()))
|
||||
}
|
||||
|
||||
func TestHandshakeClientALPNMatch(t *testing.T) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue