// // Copyright (c) 2017 anygone contributors (see AUTHORS file) // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. // // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // * Neither the name of anygone nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // package satp import ( "bytes" "testing" ) func TestKDRoleMarshalText(t *testing.T) { testvectors := []struct { role KDRole out []byte }{ {RoleLeft, []byte("left")}, {RoleRight, []byte("right")}, {17, []byte("unknown")}, } for _, vector := range testvectors { out, err := vector.role.MarshalText() if err != nil { t.Fatal("unexpected error:", err) } if !bytes.Equal(out, vector.out) { t.Fatalf("role name should be %q but is %q", string(vector.out), string(out)) } } } func TestKDRoleUnmarshalText(t *testing.T) { testvectors := []struct { role KDRole in []byte valid bool }{ {RoleLeft, []byte(""), false}, {RoleRight, []byte("foo"), false}, {RoleLeft, []byte("left-ish"), false}, {RoleLeft, []byte("servers"), false}, {RoleRight, []byte("eve"), false}, {RoleLeft, []byte("left"), true}, {RoleRight, []byte("right"), true}, {RoleLeft, []byte("server"), true}, {RoleRight, []byte("client"), true}, {RoleLeft, []byte("alice"), true}, {RoleRight, []byte("bob"), true}, } for _, vector := range testvectors { var r KDRole err := r.UnmarshalText(vector.in) if vector.valid { if err != nil { t.Fatal("unexpected error:", err) } if r != vector.role { t.Fatalf("unmarshalling %q returned %s but should be %s", string(vector.in), r, vector.role) } } else { if err == nil { t.Fatalf("unmarshalling %q should give and error", string(vector.in)) } } } } func TestKDGetLabel(t *testing.T) { testvectors := []struct { role KDRole dir Direction usage KeyUsage label uint32 }{ {RoleLeft, Outbound, UsageEncryptKey, 0x356A192B}, {RoleRight, Outbound, UsageEncryptKey, 0xDA4B9237}, {RoleLeft, Outbound, UsageEncryptSalt, 0x77DE68DA}, {RoleRight, Outbound, UsageEncryptSalt, 0x1B645389}, {RoleLeft, Outbound, UsageAuthKey, 0xAC3478D6}, {RoleRight, Outbound, UsageAuthKey, 0xC1DFD96E}, {RoleLeft, Inbound, UsageEncryptKey, 0xDA4B9237}, {RoleRight, Inbound, UsageEncryptKey, 0x356A192B}, {RoleLeft, Inbound, UsageEncryptSalt, 0x1B645389}, {RoleRight, Inbound, UsageEncryptSalt, 0x77DE68DA}, {RoleLeft, Inbound, UsageAuthKey, 0xC1DFD96E}, {RoleRight, Inbound, UsageAuthKey, 0xAC3478D6}, } for _, vector := range testvectors { label := getKDLabel(vector.role, vector.dir, vector.usage) if label != vector.label { t.Fatalf("returned label is invalid, is: 0x%08X, should be 0x%08X", label, vector.label) } } }