Initial commit
This commit is contained in:
139
session_test.go
Normal file
139
session_test.go
Normal file
@@ -0,0 +1,139 @@
|
||||
package lafsession
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestHandshakeAndSealOpen(t *testing.T) {
|
||||
serverID, err := GenerateIdentity()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
clientID, err := GenerateIdentity()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
serverPin := make(map[string]bool)
|
||||
serverPin[FingerprintOf(clientID.PublicBytes())] = true
|
||||
clientPin := make(map[string]bool)
|
||||
clientPin[FingerprintOf(serverID.PublicBytes())] = true
|
||||
|
||||
srv, err := New(Config{
|
||||
Identity: serverID,
|
||||
Role: RoleServer,
|
||||
AcceptPeer: func(pub []byte) bool {
|
||||
return serverPin[FingerprintOf(pub)]
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
cli, err := New(Config{
|
||||
Identity: clientID,
|
||||
Role: RoleClient,
|
||||
AcceptPeer: func(pub []byte) bool {
|
||||
return clientPin[FingerprintOf(pub)]
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
ch, err := cli.StartHandshake()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
sh, err := srv.HandleHandshake(ch)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if sh == nil {
|
||||
t.Fatal("expected ServerHello")
|
||||
}
|
||||
|
||||
cf, err := cli.HandleHandshake(sh)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if cf == nil {
|
||||
t.Fatal("expected ClientFinished")
|
||||
}
|
||||
|
||||
_, err = srv.HandleHandshake(cf)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !srv.Established() {
|
||||
t.Fatal("server should be established after ClientFinished")
|
||||
}
|
||||
|
||||
sf, err := srv.SendFinished()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
_, err = cli.HandleHandshake(sf)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !cli.Established() {
|
||||
t.Fatal("client should be established after ServerFinished")
|
||||
}
|
||||
|
||||
laf := []byte{0x05, 0x80, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0xde, 0xad, 0xbe, 0xef}
|
||||
|
||||
frame, err := cli.Seal(laf)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
got, err := srv.Open(frame)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !bytes.Equal(got, laf) {
|
||||
t.Fatalf("payload mismatch: got %x want %x", got, laf)
|
||||
}
|
||||
|
||||
frame2, err := srv.Seal(laf)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
got2, err := cli.Open(frame2)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !bytes.Equal(got2, laf) {
|
||||
t.Fatalf("payload mismatch c2s")
|
||||
}
|
||||
|
||||
_, err = srv.Open(frame)
|
||||
if err != ErrReplay {
|
||||
t.Fatalf("expected ErrReplay, got %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRejectUnknownPeer(t *testing.T) {
|
||||
serverID, _ := GenerateIdentity()
|
||||
clientID, _ := GenerateIdentity()
|
||||
|
||||
srv, _ := New(Config{
|
||||
Identity: serverID,
|
||||
Role: RoleServer,
|
||||
AcceptPeer: func(pub []byte) bool {
|
||||
return false
|
||||
},
|
||||
})
|
||||
cli, _ := New(Config{
|
||||
Identity: clientID,
|
||||
Role: RoleClient,
|
||||
AcceptPeer: func(pub []byte) bool { return true },
|
||||
})
|
||||
|
||||
ch, _ := cli.StartHandshake()
|
||||
_, err := srv.HandleHandshake(ch)
|
||||
if err != ErrIdentityRejected {
|
||||
t.Fatalf("expected ErrIdentityRejected, got %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user