blob: 10f81bd6dde65d96815988ec54b3cb3e38fb6bb9 [file] [log] [blame]
Andres Morales6c9fe692015-02-23 10:44:41 -08001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gtest/gtest.h>
18#include <string.h>
19#include <stdlib.h>
20#include <stdio.h>
21
22#include <keyguard/keyguard_messages.h>
23
24using ::keyguard::SizedBuffer;
25using ::testing::Test;
26using ::keyguard::EnrollRequest;
27using ::keyguard::EnrollResponse;
28using ::keyguard::VerifyRequest;
29using ::keyguard::VerifyResponse;
30using std::cout;
31using std::endl;
32
Andres Moralesac808182015-02-26 14:11:04 -080033static const uint32_t USER_ID = 3857;
34
Andres Morales6c9fe692015-02-23 10:44:41 -080035static SizedBuffer *make_buffer(size_t size) {
36 SizedBuffer *result = new SizedBuffer;
37 result->length = size;
38 uint8_t *buffer = new uint8_t[size];
39 srand(size);
40
41 for (size_t i = 0; i < size; i++) {
42 buffer[i] = rand();
43 }
44
45 result->buffer.reset(buffer);
46 return result;
47}
48
49TEST(RoundTripTest, EnrollRequest) {
50 const size_t password_size = 512;
51 SizedBuffer *provided_password = make_buffer(password_size);
52 const SizedBuffer *deserialized_password;
53 // create request, serialize, deserialize, and validate
Andres Moralesac808182015-02-26 14:11:04 -080054 EnrollRequest req(USER_ID, provided_password);
Andres Morales6c9fe692015-02-23 10:44:41 -080055 uint8_t *serialized_req = req.Serialize();
56 EnrollRequest deserialized_req;
57 deserialized_req.Deserialize(serialized_req, serialized_req + req.GetSerializedSize());
58 delete[] serialized_req;
59
60 ASSERT_EQ(keyguard::keyguard_error_t::KG_ERROR_OK,
Andres Moralesb2abaa82015-03-03 09:09:18 -080061 deserialized_req.error);
Andres Morales6c9fe692015-02-23 10:44:41 -080062
Andres Moralesb2abaa82015-03-03 09:09:18 -080063 deserialized_password = &deserialized_req.provided_password;
64 ASSERT_EQ(USER_ID, deserialized_req.user_id);
Andres Morales6c9fe692015-02-23 10:44:41 -080065 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -080066 ASSERT_EQ(0, memcmp(req.provided_password.buffer.get(), deserialized_password->buffer.get(), password_size));
67 delete provided_password;
Andres Morales6c9fe692015-02-23 10:44:41 -080068}
69
70TEST(RoundTripTest, EnrollResponse) {
71 const size_t password_size = 512;
72 SizedBuffer *enrolled_password = make_buffer(password_size);
73 const SizedBuffer *deserialized_password;
74 // create request, serialize, deserialize, and validate
Andres Moralesac808182015-02-26 14:11:04 -080075 EnrollResponse req(USER_ID, enrolled_password);
Andres Morales6c9fe692015-02-23 10:44:41 -080076 uint8_t *serialized_req = req.Serialize();
77 EnrollResponse deserialized_req;
78 deserialized_req.Deserialize(serialized_req, serialized_req + req.GetSerializedSize());
79 delete[] serialized_req;
80
81 ASSERT_EQ(keyguard::keyguard_error_t::KG_ERROR_OK,
Andres Moralesb2abaa82015-03-03 09:09:18 -080082 deserialized_req.error);
Andres Morales6c9fe692015-02-23 10:44:41 -080083
Andres Moralesb2abaa82015-03-03 09:09:18 -080084 deserialized_password = &deserialized_req.enrolled_password_handle;
85 ASSERT_EQ(USER_ID, deserialized_req.user_id);
Andres Morales6c9fe692015-02-23 10:44:41 -080086 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -080087 ASSERT_EQ(0, memcmp(req.enrolled_password_handle.buffer.get(),
88 deserialized_password->buffer.get(), password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -080089}
90
91TEST(RoundTripTest, VerifyRequest) {
Andres Moralesac808182015-02-26 14:11:04 -080092 const size_t password_size = 512;
Andres Morales6c9fe692015-02-23 10:44:41 -080093 SizedBuffer *provided_password = make_buffer(password_size),
94 *password_handle = make_buffer(password_size);
95 const SizedBuffer *deserialized_password;
96 // create request, serialize, deserialize, and validate
Andres Moralesac808182015-02-26 14:11:04 -080097 VerifyRequest req(USER_ID, password_handle, provided_password);
Andres Morales6c9fe692015-02-23 10:44:41 -080098 uint8_t *serialized_req = req.Serialize();
99 VerifyRequest deserialized_req;
100 deserialized_req.Deserialize(serialized_req, serialized_req + req.GetSerializedSize());
101
102 ASSERT_EQ(keyguard::keyguard_error_t::KG_ERROR_OK,
Andres Moralesb2abaa82015-03-03 09:09:18 -0800103 deserialized_req.error);
Andres Morales6c9fe692015-02-23 10:44:41 -0800104
Andres Moralesb2abaa82015-03-03 09:09:18 -0800105 ASSERT_EQ(USER_ID, deserialized_req.user_id);
106 deserialized_password = &deserialized_req.password_handle;
Andres Morales6c9fe692015-02-23 10:44:41 -0800107 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -0800108 ASSERT_EQ(0, memcmp(req.provided_password.buffer.get(), deserialized_password->buffer.get(),
109 password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -0800110
Andres Moralesb2abaa82015-03-03 09:09:18 -0800111 deserialized_password = &deserialized_req.password_handle;
Andres Morales6c9fe692015-02-23 10:44:41 -0800112 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -0800113 ASSERT_EQ(0, memcmp(req.password_handle.buffer.get(), deserialized_password->buffer.get(),
114 password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -0800115}
116
117TEST(RoundTripTest, VerifyResponse) {
118 const size_t password_size = 512;
119 SizedBuffer *verification_token = make_buffer(password_size);
120 const SizedBuffer *deserialized_password;
121 // create request, serialize, deserialize, and validate
Andres Moralesac808182015-02-26 14:11:04 -0800122 VerifyResponse req(USER_ID, verification_token);
Andres Morales6c9fe692015-02-23 10:44:41 -0800123 uint8_t *serialized_req = req.Serialize();
124 VerifyResponse deserialized_req;
125 deserialized_req.Deserialize(serialized_req, serialized_req + req.GetSerializedSize());
126 delete[] serialized_req;
127
128 ASSERT_EQ(keyguard::keyguard_error_t::KG_ERROR_OK,
Andres Moralesb2abaa82015-03-03 09:09:18 -0800129 deserialized_req.error);
Andres Morales6c9fe692015-02-23 10:44:41 -0800130
Andres Moralesb2abaa82015-03-03 09:09:18 -0800131 ASSERT_EQ(USER_ID, deserialized_req.user_id);
132 deserialized_password = &deserialized_req.verification_token;
Andres Morales6c9fe692015-02-23 10:44:41 -0800133 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -0800134 ASSERT_EQ(0, memcmp(req.verification_token.buffer.get(), deserialized_password->buffer.get(),
135 password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -0800136}
137
138uint8_t msgbuf[] = {
139 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
140 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109,
141 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228,
142 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236,
143 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25,
144 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179,
145 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17,
146 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88,
147 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214,
148 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125,
149 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72,
150 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
151 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0,
152 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0,
153 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112,
154 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145,
155 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0,
156 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0,
157 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0,
158 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3,
159 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0,
160 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1,
161 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96,
162 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0,
163 0, 190, 2, 0, 16, 1, 0, 0, 0,
164};
165
166
167/*
168 * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
169 * the result will be a crash. This is especially informative when run under Valgrind memcheck.
170 */
171
172template <typename Message> void parse_garbage() {
173 Message msg;
174 size_t array_length = sizeof(msgbuf) / sizeof(msgbuf[0]);
175 const uint8_t* end = msgbuf + array_length;
176 for (size_t i = 0; i < array_length; ++i) {
177 const uint8_t* begin = msgbuf + i;
178 const uint8_t* p = begin;
179 msg.Deserialize(p, end);
180 }
181}
182
183#define GARBAGE_TEST(Message) \
184 TEST(GarbageTest, Message) { parse_garbage<Message>(); }
185
186GARBAGE_TEST(VerifyRequest);
187GARBAGE_TEST(VerifyResponse);
188GARBAGE_TEST(EnrollRequest);
189GARBAGE_TEST(EnrollResponse);