gitee.com/ks-custle/core-gm@v0.0.0-20230922171213-b83bdd97b62c/gmtls/prf_test.go (about)

     1  // Copyright (c) 2022 zhaochun
     2  // core-gm is licensed under Mulan PSL v2.
     3  // You can use this software according to the terms and conditions of the Mulan PSL v2.
     4  // You may obtain a copy of Mulan PSL v2 at:
     5  //          http://license.coscl.org.cn/MulanPSL2
     6  // THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
     7  // See the Mulan PSL v2 for more details.
     8  
     9  /*
    10  gmtls是基于`golang/go`的`tls`包实现的国密改造版本。
    11  对应版权声明: thrid_licenses/github.com/golang/go/LICENSE
    12  */
    13  
    14  package gmtls
    15  
    16  import (
    17  	"encoding/hex"
    18  	"testing"
    19  )
    20  
    21  type testSplitPreMasterSecretTest struct {
    22  	in, out1, out2 string
    23  }
    24  
    25  var testSplitPreMasterSecretTests = []testSplitPreMasterSecretTest{
    26  	{"", "", ""},
    27  	{"00", "00", "00"},
    28  	{"0011", "00", "11"},
    29  	{"001122", "0011", "1122"},
    30  	{"00112233", "0011", "2233"},
    31  }
    32  
    33  func TestSplitPreMasterSecret(t *testing.T) {
    34  	for i, test := range testSplitPreMasterSecretTests {
    35  		in, _ := hex.DecodeString(test.in)
    36  		out1, out2 := splitPreMasterSecret(in)
    37  		s1 := hex.EncodeToString(out1)
    38  		s2 := hex.EncodeToString(out2)
    39  		if s1 != test.out1 || s2 != test.out2 {
    40  			t.Errorf("#%d: got: (%s, %s) want: (%s, %s)", i, s1, s2, test.out1, test.out2)
    41  		}
    42  	}
    43  }
    44  
    45  type testKeysFromTest struct {
    46  	version                                        uint16
    47  	suite                                          *cipherSuite
    48  	preMasterSecret                                string
    49  	clientRandom, serverRandom                     string
    50  	masterSecret                                   string
    51  	clientMAC, serverMAC                           string
    52  	clientKey, serverKey                           string
    53  	macLen, keyLen                                 int
    54  	contextKeyingMaterial, noContextKeyingMaterial string
    55  }
    56  
    57  func TestKeysFromPreMasterSecret(t *testing.T) {
    58  	for i, test := range testKeysFromTests {
    59  		in, _ := hex.DecodeString(test.preMasterSecret)
    60  		clientRandom, _ := hex.DecodeString(test.clientRandom)
    61  		serverRandom, _ := hex.DecodeString(test.serverRandom)
    62  
    63  		masterSecret := masterFromPreMasterSecret(test.version, test.suite, in, clientRandom, serverRandom)
    64  		if s := hex.EncodeToString(masterSecret); s != test.masterSecret {
    65  			t.Errorf("#%d: bad master secret %s, want %s", i, s, test.masterSecret)
    66  			continue
    67  		}
    68  
    69  		clientMAC, serverMAC, clientKey, serverKey, _, _ := keysFromMasterSecret(test.version, test.suite, masterSecret, clientRandom, serverRandom, test.macLen, test.keyLen, 0)
    70  		clientMACString := hex.EncodeToString(clientMAC)
    71  		serverMACString := hex.EncodeToString(serverMAC)
    72  		clientKeyString := hex.EncodeToString(clientKey)
    73  		serverKeyString := hex.EncodeToString(serverKey)
    74  		if clientMACString != test.clientMAC ||
    75  			serverMACString != test.serverMAC ||
    76  			clientKeyString != test.clientKey ||
    77  			serverKeyString != test.serverKey {
    78  			t.Errorf("#%d: got: (%s, %s, %s, %s) want: (%s, %s, %s, %s)", i, clientMACString, serverMACString, clientKeyString, serverKeyString, test.clientMAC, test.serverMAC, test.clientKey, test.serverKey)
    79  		}
    80  
    81  		ekm := ekmFromMasterSecret(test.version, test.suite, masterSecret, clientRandom, serverRandom)
    82  		contextKeyingMaterial, err := ekm("label", []byte("context"), 32)
    83  		if err != nil {
    84  			t.Fatalf("ekmFromMasterSecret failed: %v", err)
    85  		}
    86  
    87  		noContextKeyingMaterial, err := ekm("label", nil, 32)
    88  		if err != nil {
    89  			t.Fatalf("ekmFromMasterSecret failed: %v", err)
    90  		}
    91  
    92  		if hex.EncodeToString(contextKeyingMaterial) != test.contextKeyingMaterial ||
    93  			hex.EncodeToString(noContextKeyingMaterial) != test.noContextKeyingMaterial {
    94  			t.Errorf("#%d: got keying material: (%s, %s) want: (%s, %s)", i, contextKeyingMaterial, noContextKeyingMaterial, test.contextKeyingMaterial, test.noContextKeyingMaterial)
    95  		}
    96  	}
    97  }
    98  
    99  // These test vectors were generated from GnuTLS using `gnutls-cli --insecure -d 9 `
   100  var testKeysFromTests = []testKeysFromTest{
   101  	{
   102  		VersionTLS10,
   103  		cipherSuiteByID(TLS_RSA_WITH_RC4_128_SHA),
   104  		"0302cac83ad4b1db3b9ab49ad05957de2a504a634a386fc600889321e1a971f57479466830ac3e6f468e87f5385fa0c5",
   105  		"4ae66303755184a3917fcb44880605fcc53baa01912b22ed94473fc69cebd558",
   106  		"4ae663020ec16e6bb5130be918cfcafd4d765979a3136a5d50c593446e4e44db",
   107  		"3d851bab6e5556e959a16bc36d66cfae32f672bfa9ecdef6096cbb1b23472df1da63dbbd9827606413221d149ed08ceb",
   108  		"805aaa19b3d2c0a0759a4b6c9959890e08480119",
   109  		"2d22f9fe519c075c16448305ceee209fc24ad109",
   110  		"d50b5771244f850cd8117a9ccafe2cf1",
   111  		"e076e33206b30507a85c32855acd0919",
   112  		20,
   113  		16,
   114  		"4d1bb6fc278c37d27aa6e2a13c2e079095d143272c2aa939da33d88c1c0cec22",
   115  		"93fba89599b6321ae538e27c6548ceb8b46821864318f5190d64a375e5d69d41",
   116  	},
   117  	{
   118  		VersionTLS10,
   119  		cipherSuiteByID(TLS_RSA_WITH_RC4_128_SHA),
   120  		"03023f7527316bc12cbcd69e4b9e8275d62c028f27e65c745cfcddc7ce01bd3570a111378b63848127f1c36e5f9e4890",
   121  		"4ae66364b5ea56b20ce4e25555aed2d7e67f42788dd03f3fee4adae0459ab106",
   122  		"4ae66363ab815cbf6a248b87d6b556184e945e9b97fbdf247858b0bdafacfa1c",
   123  		"7d64be7c80c59b740200b4b9c26d0baaa1c5ae56705acbcf2307fe62beb4728c19392c83f20483801cce022c77645460",
   124  		"97742ed60a0554ca13f04f97ee193177b971e3b0",
   125  		"37068751700400e03a8477a5c7eec0813ab9e0dc",
   126  		"207cddbc600d2a200abac6502053ee5c",
   127  		"df3f94f6e1eacc753b815fe16055cd43",
   128  		20,
   129  		16,
   130  		"2c9f8961a72b97cbe76553b5f954caf8294fc6360ef995ac1256fe9516d0ce7f",
   131  		"274f19c10291d188857ad8878e2119f5aa437d4da556601cf1337aff23154016",
   132  	},
   133  	{
   134  		VersionTLS10,
   135  		cipherSuiteByID(TLS_RSA_WITH_RC4_128_SHA),
   136  		"832d515f1d61eebb2be56ba0ef79879efb9b527504abb386fb4310ed5d0e3b1f220d3bb6b455033a2773e6d8bdf951d278a187482b400d45deb88a5d5a6bb7d6a7a1decc04eb9ef0642876cd4a82d374d3b6ff35f0351dc5d411104de431375355addc39bfb1f6329fb163b0bc298d658338930d07d313cd980a7e3d9196cac1",
   137  		"4ae663b2ee389c0de147c509d8f18f5052afc4aaf9699efe8cb05ece883d3a5e",
   138  		"4ae664d503fd4cff50cfc1fb8fc606580f87b0fcdac9554ba0e01d785bdf278e",
   139  		"1aff2e7a2c4279d0126f57a65a77a8d9d0087cf2733366699bec27eb53d5740705a8574bb1acc2abbe90e44f0dd28d6c",
   140  		"3c7647c93c1379a31a609542aa44e7f117a70085",
   141  		"0d73102994be74a575a3ead8532590ca32a526d4",
   142  		"ac7581b0b6c10d85bbd905ffbf36c65e",
   143  		"ff07edde49682b45466bd2e39464b306",
   144  		20,
   145  		16,
   146  		"678b0d43f607de35241dc7e9d1a7388a52c35033a1a0336d4d740060a6638fe2",
   147  		"f3b4ac743f015ef21d79978297a53da3e579ee047133f38c234d829c0f907dab",
   148  	},
   149  }