blob: e58db041c69b94ca988311a63288277a9cf8dd99 [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
Andres Morales7d0f0402015-03-19 18:02:55 -070022#include <gatekeeper/gatekeeper_messages.h>
Andres Morales6c9fe692015-02-23 10:44:41 -080023
Andres Morales7d0f0402015-03-19 18:02:55 -070024using ::gatekeeper::SizedBuffer;
Andres Morales6c9fe692015-02-23 10:44:41 -080025using ::testing::Test;
Andres Morales7d0f0402015-03-19 18:02:55 -070026using ::gatekeeper::EnrollRequest;
27using ::gatekeeper::EnrollResponse;
28using ::gatekeeper::VerifyRequest;
29using ::gatekeeper::VerifyResponse;
Andres Morales6c9fe692015-02-23 10:44:41 -080030using 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
Andres Moralesedd3e3d2015-03-12 13:30:15 -070049TEST(RoundTripTest, EnrollRequestNullEnrolledNullHandle) {
Andres Morales6c9fe692015-02-23 10:44:41 -080050 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 Moralesedd3e3d2015-03-12 13:30:15 -070054 EnrollRequest req(USER_ID, NULL, provided_password, NULL);
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
Andres Morales7d0f0402015-03-19 18:02:55 -070060 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
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));
Andres Moralesedd3e3d2015-03-12 13:30:15 -070067 ASSERT_EQ((size_t) 0, deserialized_req.enrolled_password.length);
68 ASSERT_EQ(NULL, deserialized_req.enrolled_password.buffer.get());
69 ASSERT_EQ((size_t) 0, deserialized_req.password_handle.length);
70 ASSERT_EQ(NULL, deserialized_req.password_handle.buffer.get());
Andres Moralesb2abaa82015-03-03 09:09:18 -080071 delete provided_password;
Andres Morales6c9fe692015-02-23 10:44:41 -080072}
73
Andres Moralesedd3e3d2015-03-12 13:30:15 -070074TEST(RoundTripTest, EnrollRequestEmptyEnrolledEmptyHandle) {
75 const size_t password_size = 512;
76 SizedBuffer *provided_password = make_buffer(password_size);
77 SizedBuffer enrolled;
78 SizedBuffer handle;
79 const SizedBuffer *deserialized_password;
80 // create request, serialize, deserialize, and validate
81 EnrollRequest req(USER_ID, &handle, provided_password, &enrolled);
82 uint8_t *serialized_req = req.Serialize();
83 EnrollRequest deserialized_req;
84 deserialized_req.Deserialize(serialized_req, serialized_req + req.GetSerializedSize());
85 delete[] serialized_req;
86
Andres Morales7d0f0402015-03-19 18:02:55 -070087 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
Andres Moralesedd3e3d2015-03-12 13:30:15 -070088 deserialized_req.error);
89
90 deserialized_password = &deserialized_req.provided_password;
91 ASSERT_EQ(USER_ID, deserialized_req.user_id);
92 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
93 ASSERT_EQ(0, memcmp(req.provided_password.buffer.get(), deserialized_password->buffer.get(), password_size));
94 ASSERT_EQ((size_t) 0, deserialized_req.enrolled_password.length);
95 ASSERT_EQ(NULL, deserialized_req.enrolled_password.buffer.get());
96 ASSERT_EQ((size_t) 0, deserialized_req.password_handle.length);
97 ASSERT_EQ(NULL, deserialized_req.password_handle.buffer.get());
98 delete provided_password;
99}
100
101TEST(RoundTripTest, EnrollRequestNonNullEnrolledOrHandle) {
102 const size_t password_size = 512;
103 SizedBuffer *provided_password = make_buffer(password_size);
104 SizedBuffer *enrolled_password = make_buffer(password_size);
105 SizedBuffer *password_handle = make_buffer(password_size);
106 const SizedBuffer *deserialized_password;
107 const SizedBuffer *deserialized_enrolled;
108 const SizedBuffer *deserialized_handle;
109 // create request, serialize, deserialize, and validate
110 EnrollRequest req(USER_ID, password_handle, provided_password, enrolled_password);
111 uint8_t *serialized_req = req.Serialize();
112 EnrollRequest deserialized_req;
113 deserialized_req.Deserialize(serialized_req, serialized_req + req.GetSerializedSize());
114 delete[] serialized_req;
115
Andres Morales7d0f0402015-03-19 18:02:55 -0700116 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700117 deserialized_req.error);
118
119 deserialized_password = &deserialized_req.provided_password;
120 deserialized_enrolled = &deserialized_req.enrolled_password;
121 deserialized_handle = &deserialized_req.password_handle;
122 ASSERT_EQ(USER_ID, deserialized_req.user_id);
123 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
124 ASSERT_EQ(0, memcmp(req.provided_password.buffer.get(), deserialized_password->buffer.get(), password_size));
125 ASSERT_EQ((uint32_t) password_size, deserialized_enrolled->length);
126 ASSERT_EQ(0, memcmp(req.enrolled_password.buffer.get(), deserialized_enrolled->buffer.get(), password_size));
127 ASSERT_EQ((uint32_t) password_size, deserialized_handle->length);
128 ASSERT_EQ(0, memcmp(req.password_handle.buffer.get(), deserialized_handle->buffer.get(), password_size));
129 delete provided_password;
130 delete enrolled_password;
131 delete password_handle;
132}
133
134
Andres Morales6c9fe692015-02-23 10:44:41 -0800135TEST(RoundTripTest, EnrollResponse) {
136 const size_t password_size = 512;
137 SizedBuffer *enrolled_password = make_buffer(password_size);
138 const SizedBuffer *deserialized_password;
139 // create request, serialize, deserialize, and validate
Andres Moralesac808182015-02-26 14:11:04 -0800140 EnrollResponse req(USER_ID, enrolled_password);
Andres Morales6c9fe692015-02-23 10:44:41 -0800141 uint8_t *serialized_req = req.Serialize();
142 EnrollResponse deserialized_req;
143 deserialized_req.Deserialize(serialized_req, serialized_req + req.GetSerializedSize());
144 delete[] serialized_req;
145
Andres Morales7d0f0402015-03-19 18:02:55 -0700146 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
Andres Moralesb2abaa82015-03-03 09:09:18 -0800147 deserialized_req.error);
Andres Morales6c9fe692015-02-23 10:44:41 -0800148
Andres Moralesb2abaa82015-03-03 09:09:18 -0800149 deserialized_password = &deserialized_req.enrolled_password_handle;
150 ASSERT_EQ(USER_ID, deserialized_req.user_id);
Andres Morales6c9fe692015-02-23 10:44:41 -0800151 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -0800152 ASSERT_EQ(0, memcmp(req.enrolled_password_handle.buffer.get(),
153 deserialized_password->buffer.get(), password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -0800154}
155
156TEST(RoundTripTest, VerifyRequest) {
Andres Moralesac808182015-02-26 14:11:04 -0800157 const size_t password_size = 512;
Andres Morales6c9fe692015-02-23 10:44:41 -0800158 SizedBuffer *provided_password = make_buffer(password_size),
159 *password_handle = make_buffer(password_size);
160 const SizedBuffer *deserialized_password;
161 // create request, serialize, deserialize, and validate
Andres Moralesac808182015-02-26 14:11:04 -0800162 VerifyRequest req(USER_ID, password_handle, provided_password);
Andres Morales6c9fe692015-02-23 10:44:41 -0800163 uint8_t *serialized_req = req.Serialize();
164 VerifyRequest deserialized_req;
165 deserialized_req.Deserialize(serialized_req, serialized_req + req.GetSerializedSize());
166
Andres Morales7d0f0402015-03-19 18:02:55 -0700167 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
Andres Moralesb2abaa82015-03-03 09:09:18 -0800168 deserialized_req.error);
Andres Morales6c9fe692015-02-23 10:44:41 -0800169
Andres Moralesb2abaa82015-03-03 09:09:18 -0800170 ASSERT_EQ(USER_ID, deserialized_req.user_id);
171 deserialized_password = &deserialized_req.password_handle;
Andres Morales6c9fe692015-02-23 10:44:41 -0800172 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -0800173 ASSERT_EQ(0, memcmp(req.provided_password.buffer.get(), deserialized_password->buffer.get(),
174 password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -0800175
Andres Moralesb2abaa82015-03-03 09:09:18 -0800176 deserialized_password = &deserialized_req.password_handle;
Andres Morales6c9fe692015-02-23 10:44:41 -0800177 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -0800178 ASSERT_EQ(0, memcmp(req.password_handle.buffer.get(), deserialized_password->buffer.get(),
179 password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -0800180}
181
182TEST(RoundTripTest, VerifyResponse) {
183 const size_t password_size = 512;
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700184 SizedBuffer *auth_token = make_buffer(password_size);
Andres Morales6c9fe692015-02-23 10:44:41 -0800185 const SizedBuffer *deserialized_password;
186 // create request, serialize, deserialize, and validate
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700187 VerifyResponse req(USER_ID, auth_token);
Andres Morales6c9fe692015-02-23 10:44:41 -0800188 uint8_t *serialized_req = req.Serialize();
189 VerifyResponse deserialized_req;
190 deserialized_req.Deserialize(serialized_req, serialized_req + req.GetSerializedSize());
191 delete[] serialized_req;
192
Andres Morales7d0f0402015-03-19 18:02:55 -0700193 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
Andres Moralesb2abaa82015-03-03 09:09:18 -0800194 deserialized_req.error);
Andres Morales6c9fe692015-02-23 10:44:41 -0800195
Andres Moralesb2abaa82015-03-03 09:09:18 -0800196 ASSERT_EQ(USER_ID, deserialized_req.user_id);
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700197 deserialized_password = &deserialized_req.auth_token;
Andres Morales6c9fe692015-02-23 10:44:41 -0800198 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700199 ASSERT_EQ(0, memcmp(req.auth_token.buffer.get(), deserialized_password->buffer.get(),
Andres Moralesb2abaa82015-03-03 09:09:18 -0800200 password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -0800201}
202
203uint8_t msgbuf[] = {
204 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
205 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109,
206 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228,
207 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236,
208 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25,
209 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179,
210 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17,
211 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88,
212 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214,
213 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125,
214 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72,
215 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
216 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0,
217 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0,
218 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112,
219 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145,
220 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0,
221 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0,
222 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0,
223 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3,
224 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0,
225 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1,
226 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96,
227 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0,
228 0, 190, 2, 0, 16, 1, 0, 0, 0,
229};
230
231
232/*
233 * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
234 * the result will be a crash. This is especially informative when run under Valgrind memcheck.
235 */
236
237template <typename Message> void parse_garbage() {
238 Message msg;
239 size_t array_length = sizeof(msgbuf) / sizeof(msgbuf[0]);
240 const uint8_t* end = msgbuf + array_length;
241 for (size_t i = 0; i < array_length; ++i) {
242 const uint8_t* begin = msgbuf + i;
243 const uint8_t* p = begin;
244 msg.Deserialize(p, end);
245 }
246}
247
248#define GARBAGE_TEST(Message) \
249 TEST(GarbageTest, Message) { parse_garbage<Message>(); }
250
251GARBAGE_TEST(VerifyRequest);
252GARBAGE_TEST(VerifyResponse);
253GARBAGE_TEST(EnrollRequest);
254GARBAGE_TEST(EnrollResponse);