1 // Copyright 2012 Google Inc. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include <gtest/gtest.h> 16 #include <openssl/err.h> 17 18 #include <polo/pairing/polochallengeresponse.h> 19 #include <polo/util/poloutil.h> 20 21 namespace polo { 22 namespace pairing { 23 24 class PoloChallengeResponseTest : public ::testing::Test { 25 protected: 26 PoloChallengeResponseTest() : nonce(4) { } 27 28 virtual void SetUp() { 29 // Test certificates generated using: 30 // openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out cert.pem 31 32 char client_pem[] = "-----BEGIN CERTIFICATE-----\n" 33 "MIICsDCCAhmgAwIBAgIJAI1seGT4bQoOMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNV\n" 34 "BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX\n" 35 "aWRnaXRzIFB0eSBMdGQwHhcNMTAxMjEyMTYwMzI3WhcNMTExMjEyMTYwMzI3WjBF\n" 36 "MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50\n" 37 "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n" 38 "gQDa7AitkkzqAZjsoJ3Y5eeq2LZtkF8xMWKuZMOaKDzOaTOBpfiFXbIsrOrHJvh0\n" 39 "WIUI7MEu4KTknpqyTEhwqyYozeOoJnhVVaKE03TQTMKgLhc4PwO35NJXHkFxJts1\n" 40 "OSCFZ7SQm8OMIr6eEMLh6v7UQQ/GryNY+v5SYiVsbfgW3QIDAQABo4GnMIGkMB0G\n" 41 "A1UdDgQWBBRBiLSqlUt+9ZXMBLBp141te487bTB1BgNVHSMEbjBsgBRBiLSqlUt+\n" 42 "9ZXMBLBp141te487baFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUt\n" 43 "U3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAI1seGT4\n" 44 "bQoOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAchrbHb8S0WCGRupi\n" 45 "lxwnD6aVVmVsnNiOaLSI1I6RCKeS0SG/fseThd9nh92WZh6Rbx3U3rAMD08wDfSt\n" 46 "S9h7bukJ0X9Rs/BTirzT7Cl09PUjoawP8MeLEDFRUzcBsSYr/k/IPAWOrazWQ2tu\n" 47 "XO5L5nPKzpxd3tF4Aj4/3kBm4nw=\n" 48 "-----END CERTIFICATE-----\n"; 49 50 char server_pem[] = "-----BEGIN CERTIFICATE-----\n" 51 "MIICsDCCAhmgAwIBAgIJAPa14A4WCQpNMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNV\n" 52 "BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX\n" 53 "aWRnaXRzIFB0eSBMdGQwHhcNMTAxMjEyMTYwNzMzWhcNMTExMjEyMTYwNzMzWjBF\n" 54 "MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50\n" 55 "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n" 56 "gQDBkfualV4+vxIEBg1TWXy2T1nf0Dch8XoQG824o3EAzuIRHdBGHvzRNfmQOlje\n" 57 "XVU/Cds376EYOblxoZNVNQYMf1fkwTUnDWXNl3wR5A4m4Govi2y61b7NA8/AMxO9\n" 58 "wtuIAI+Yty2UAjacvt3yqG2J1r55kIOsYeDoy1E5Hpo8gwIDAQABo4GnMIGkMB0G\n" 59 "A1UdDgQWBBRgMM6zsFJ2DGv7B1URsUmx1BBAPzB1BgNVHSMEbjBsgBRgMM6zsFJ2\n" 60 "DGv7B1URsUmx1BBAP6FJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUt\n" 61 "U3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAPa14A4W\n" 62 "CQpNMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAoU/4pb2QTEgCwhzG\n" 63 "k6BPIz2WhOeIAAZ9fQmVxL5pbcgIUC4SnoJ3MtwB02Abbk5pIeSgtgJ50R4SmluM\n" 64 "T+0G1p772RqN+tLWihJqWgmODhfppUm9pp07UfL6yn4wAnyvzevadVXl6GCPocL9\n" 65 "cvcuBiBPlRU/giP3n15OtJ6KL9U=\n" 66 "-----END CERTIFICATE-----\n"; 67 68 SSL_load_error_strings(); 69 70 client_bio = BIO_new_mem_buf(client_pem, -1); 71 client_cert = PEM_read_bio_X509(client_bio, NULL, NULL, NULL); 72 73 server_bio = BIO_new_mem_buf(server_pem, -1); 74 server_cert = PEM_read_bio_X509(server_bio, NULL, NULL, NULL); 75 76 nonce[0] = 0x1; 77 nonce[1] = 0x2; 78 nonce[2] = 0x3; 79 nonce[3] = 0x4; 80 81 response = new PoloChallengeResponse(client_cert, server_cert); 82 } 83 84 virtual void TearDown() { 85 X509_free(client_cert); 86 BIO_free(client_bio); 87 88 X509_free(server_cert); 89 BIO_free(server_bio); 90 91 delete response; 92 } 93 94 BIO* client_bio; 95 X509* client_cert; 96 BIO* server_bio; 97 X509* server_cert; 98 Nonce nonce; 99 PoloChallengeResponse* response; 100 }; 101 102 TEST_F(PoloChallengeResponseTest, GetAlpha) { 103 const Alpha* alpha = response->GetAlpha(nonce); 104 ASSERT_TRUE(alpha); 105 106 ASSERT_EQ("E4DA87E4A544B30C98FC8A4731C10828506A97BA143950D7C68D9BF58ED4C397", 107 util::PoloUtil::BytesToHexString(&(*alpha)[0], alpha->size())); 108 delete alpha; 109 } 110 111 TEST_F(PoloChallengeResponseTest, TestGetGamma) { 112 const Gamma* gamma = response->GetGamma(nonce); 113 ASSERT_TRUE(gamma); 114 115 ASSERT_EQ("E4DA87E401020304", 116 util::PoloUtil::BytesToHexString(&(*gamma)[0], gamma->size())); 117 delete gamma; 118 } 119 120 TEST_F(PoloChallengeResponseTest, TestExtractNonce) { 121 const Gamma* gamma = response->GetGamma(nonce); 122 ASSERT_TRUE(gamma); 123 ASSERT_EQ("E4DA87E401020304", 124 util::PoloUtil::BytesToHexString(&(*gamma)[0], gamma->size())); 125 126 const Nonce* extracted = response->ExtractNonce(*gamma); 127 ASSERT_TRUE(extracted); 128 ASSERT_EQ("01020304", 129 util::PoloUtil::BytesToHexString(&(*extracted)[0], 130 extracted->size())); 131 132 delete gamma; 133 delete extracted; 134 } 135 136 TEST_F(PoloChallengeResponseTest, TestCheckGamma) { 137 Gamma gamma(8); 138 gamma[0] = 0xE4; 139 gamma[1] = 0xDA; 140 gamma[2] = 0x87; 141 gamma[3] = 0xE4; 142 gamma[4] = 0x01; 143 gamma[5] = 0x02; 144 gamma[6] = 0x03; 145 gamma[7] = 0x04; 146 147 ASSERT_TRUE(response->CheckGamma(gamma)); 148 } 149 150 } // namespace pairing 151 } // namespace polo 152