blob: 1380aac9236b6d8c91b19189bb3cd5b5cb3f280b [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 Morales8add7e22015-03-24 11:10:42 -070055 SizedBuffer serialized_req(req.GetSerializedSize());
56 req.Serialize(serialized_req.buffer.get(), serialized_req.buffer.get() + serialized_req.length);
57
Andres Morales6c9fe692015-02-23 10:44:41 -080058 EnrollRequest deserialized_req;
Andres Morales8add7e22015-03-24 11:10:42 -070059 deserialized_req.Deserialize(serialized_req.buffer.get(), serialized_req.buffer.get()
60 + serialized_req.length);
Andres Morales6c9fe692015-02-23 10:44:41 -080061
Andres Morales7d0f0402015-03-19 18:02:55 -070062 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
Andres Moralesb2abaa82015-03-03 09:09:18 -080063 deserialized_req.error);
Andres Morales6c9fe692015-02-23 10:44:41 -080064
Andres Moralesb2abaa82015-03-03 09:09:18 -080065 deserialized_password = &deserialized_req.provided_password;
66 ASSERT_EQ(USER_ID, deserialized_req.user_id);
Andres Morales6c9fe692015-02-23 10:44:41 -080067 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -080068 ASSERT_EQ(0, memcmp(req.provided_password.buffer.get(), deserialized_password->buffer.get(), password_size));
Andres Moralesedd3e3d2015-03-12 13:30:15 -070069 ASSERT_EQ((size_t) 0, deserialized_req.enrolled_password.length);
70 ASSERT_EQ(NULL, deserialized_req.enrolled_password.buffer.get());
71 ASSERT_EQ((size_t) 0, deserialized_req.password_handle.length);
72 ASSERT_EQ(NULL, deserialized_req.password_handle.buffer.get());
Andres Moralesb2abaa82015-03-03 09:09:18 -080073 delete provided_password;
Andres Morales6c9fe692015-02-23 10:44:41 -080074}
75
Andres Moralesedd3e3d2015-03-12 13:30:15 -070076TEST(RoundTripTest, EnrollRequestEmptyEnrolledEmptyHandle) {
77 const size_t password_size = 512;
78 SizedBuffer *provided_password = make_buffer(password_size);
79 SizedBuffer enrolled;
80 SizedBuffer handle;
81 const SizedBuffer *deserialized_password;
82 // create request, serialize, deserialize, and validate
83 EnrollRequest req(USER_ID, &handle, provided_password, &enrolled);
Andres Morales8add7e22015-03-24 11:10:42 -070084 SizedBuffer serialized_req(req.GetSerializedSize());
85 req.Serialize(serialized_req.buffer.get(), serialized_req.buffer.get() + serialized_req.length);
86
Andres Moralesedd3e3d2015-03-12 13:30:15 -070087 EnrollRequest deserialized_req;
Andres Morales8add7e22015-03-24 11:10:42 -070088 deserialized_req.Deserialize(serialized_req.buffer.get(), serialized_req.buffer.get()
89 + serialized_req.length);
Andres Moralesedd3e3d2015-03-12 13:30:15 -070090
Andres Morales7d0f0402015-03-19 18:02:55 -070091 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
Andres Moralesedd3e3d2015-03-12 13:30:15 -070092 deserialized_req.error);
93
94 deserialized_password = &deserialized_req.provided_password;
95 ASSERT_EQ(USER_ID, deserialized_req.user_id);
96 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
97 ASSERT_EQ(0, memcmp(req.provided_password.buffer.get(), deserialized_password->buffer.get(), password_size));
98 ASSERT_EQ((size_t) 0, deserialized_req.enrolled_password.length);
99 ASSERT_EQ(NULL, deserialized_req.enrolled_password.buffer.get());
100 ASSERT_EQ((size_t) 0, deserialized_req.password_handle.length);
101 ASSERT_EQ(NULL, deserialized_req.password_handle.buffer.get());
102 delete provided_password;
103}
104
105TEST(RoundTripTest, EnrollRequestNonNullEnrolledOrHandle) {
106 const size_t password_size = 512;
107 SizedBuffer *provided_password = make_buffer(password_size);
108 SizedBuffer *enrolled_password = make_buffer(password_size);
109 SizedBuffer *password_handle = make_buffer(password_size);
110 const SizedBuffer *deserialized_password;
111 const SizedBuffer *deserialized_enrolled;
112 const SizedBuffer *deserialized_handle;
113 // create request, serialize, deserialize, and validate
114 EnrollRequest req(USER_ID, password_handle, provided_password, enrolled_password);
Andres Morales8add7e22015-03-24 11:10:42 -0700115 SizedBuffer serialized_req(req.GetSerializedSize());
116 req.Serialize(serialized_req.buffer.get(), serialized_req.buffer.get() + serialized_req.length);
117
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700118 EnrollRequest deserialized_req;
Andres Morales8add7e22015-03-24 11:10:42 -0700119 deserialized_req.Deserialize(serialized_req.buffer.get(), serialized_req.buffer.get()
120 + serialized_req.length);
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700121
Andres Morales7d0f0402015-03-19 18:02:55 -0700122 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700123 deserialized_req.error);
124
125 deserialized_password = &deserialized_req.provided_password;
126 deserialized_enrolled = &deserialized_req.enrolled_password;
127 deserialized_handle = &deserialized_req.password_handle;
128 ASSERT_EQ(USER_ID, deserialized_req.user_id);
129 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
130 ASSERT_EQ(0, memcmp(req.provided_password.buffer.get(), deserialized_password->buffer.get(), password_size));
131 ASSERT_EQ((uint32_t) password_size, deserialized_enrolled->length);
132 ASSERT_EQ(0, memcmp(req.enrolled_password.buffer.get(), deserialized_enrolled->buffer.get(), password_size));
133 ASSERT_EQ((uint32_t) password_size, deserialized_handle->length);
134 ASSERT_EQ(0, memcmp(req.password_handle.buffer.get(), deserialized_handle->buffer.get(), password_size));
135 delete provided_password;
136 delete enrolled_password;
137 delete password_handle;
138}
139
140
Andres Morales6c9fe692015-02-23 10:44:41 -0800141TEST(RoundTripTest, EnrollResponse) {
142 const size_t password_size = 512;
143 SizedBuffer *enrolled_password = make_buffer(password_size);
144 const SizedBuffer *deserialized_password;
145 // create request, serialize, deserialize, and validate
Andres Moralesac808182015-02-26 14:11:04 -0800146 EnrollResponse req(USER_ID, enrolled_password);
Andres Morales8add7e22015-03-24 11:10:42 -0700147 SizedBuffer serialized_req(req.GetSerializedSize());
148 req.Serialize(serialized_req.buffer.get(), serialized_req.buffer.get() + serialized_req.length);
149
Andres Morales6c9fe692015-02-23 10:44:41 -0800150 EnrollResponse deserialized_req;
Andres Morales8add7e22015-03-24 11:10:42 -0700151 deserialized_req.Deserialize(serialized_req.buffer.get(), serialized_req.buffer.get()
152 + serialized_req.length);
Andres Morales6c9fe692015-02-23 10:44:41 -0800153
Andres Morales7d0f0402015-03-19 18:02:55 -0700154 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
Andres Moralesb2abaa82015-03-03 09:09:18 -0800155 deserialized_req.error);
Andres Morales6c9fe692015-02-23 10:44:41 -0800156
Andres Moralesb2abaa82015-03-03 09:09:18 -0800157 deserialized_password = &deserialized_req.enrolled_password_handle;
158 ASSERT_EQ(USER_ID, deserialized_req.user_id);
Andres Morales6c9fe692015-02-23 10:44:41 -0800159 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -0800160 ASSERT_EQ(0, memcmp(req.enrolled_password_handle.buffer.get(),
161 deserialized_password->buffer.get(), password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -0800162}
163
164TEST(RoundTripTest, VerifyRequest) {
Andres Moralesac808182015-02-26 14:11:04 -0800165 const size_t password_size = 512;
Andres Morales6c9fe692015-02-23 10:44:41 -0800166 SizedBuffer *provided_password = make_buffer(password_size),
167 *password_handle = make_buffer(password_size);
168 const SizedBuffer *deserialized_password;
169 // create request, serialize, deserialize, and validate
Andres Moralesac808182015-02-26 14:11:04 -0800170 VerifyRequest req(USER_ID, password_handle, provided_password);
Andres Morales8add7e22015-03-24 11:10:42 -0700171 SizedBuffer serialized_req(req.GetSerializedSize());
172 req.Serialize(serialized_req.buffer.get(), serialized_req.buffer.get() + serialized_req.length);
173
Andres Morales6c9fe692015-02-23 10:44:41 -0800174 VerifyRequest deserialized_req;
Andres Morales8add7e22015-03-24 11:10:42 -0700175 deserialized_req.Deserialize(serialized_req.buffer.get(), serialized_req.buffer.get()
176 + serialized_req.length);
Andres Morales6c9fe692015-02-23 10:44:41 -0800177
Andres Morales7d0f0402015-03-19 18:02:55 -0700178 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
Andres Moralesb2abaa82015-03-03 09:09:18 -0800179 deserialized_req.error);
Andres Morales6c9fe692015-02-23 10:44:41 -0800180
Andres Moralesb2abaa82015-03-03 09:09:18 -0800181 ASSERT_EQ(USER_ID, deserialized_req.user_id);
182 deserialized_password = &deserialized_req.password_handle;
Andres Morales6c9fe692015-02-23 10:44:41 -0800183 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -0800184 ASSERT_EQ(0, memcmp(req.provided_password.buffer.get(), deserialized_password->buffer.get(),
185 password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -0800186
Andres Moralesb2abaa82015-03-03 09:09:18 -0800187 deserialized_password = &deserialized_req.password_handle;
Andres Morales6c9fe692015-02-23 10:44:41 -0800188 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesb2abaa82015-03-03 09:09:18 -0800189 ASSERT_EQ(0, memcmp(req.password_handle.buffer.get(), deserialized_password->buffer.get(),
190 password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -0800191}
192
193TEST(RoundTripTest, VerifyResponse) {
194 const size_t password_size = 512;
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700195 SizedBuffer *auth_token = make_buffer(password_size);
Andres Morales6c9fe692015-02-23 10:44:41 -0800196 const SizedBuffer *deserialized_password;
197 // create request, serialize, deserialize, and validate
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700198 VerifyResponse req(USER_ID, auth_token);
Andres Morales8add7e22015-03-24 11:10:42 -0700199 SizedBuffer serialized_req(req.GetSerializedSize());
200 req.Serialize(serialized_req.buffer.get(), serialized_req.buffer.get() + serialized_req.length);
201
Andres Morales6c9fe692015-02-23 10:44:41 -0800202 VerifyResponse deserialized_req;
Andres Morales8add7e22015-03-24 11:10:42 -0700203 deserialized_req.Deserialize(serialized_req.buffer.get(), serialized_req.buffer.get()
204 + serialized_req.length);
Andres Morales6c9fe692015-02-23 10:44:41 -0800205
Andres Morales7d0f0402015-03-19 18:02:55 -0700206 ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
Andres Moralesb2abaa82015-03-03 09:09:18 -0800207 deserialized_req.error);
Andres Morales6c9fe692015-02-23 10:44:41 -0800208
Andres Moralesb2abaa82015-03-03 09:09:18 -0800209 ASSERT_EQ(USER_ID, deserialized_req.user_id);
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700210 deserialized_password = &deserialized_req.auth_token;
Andres Morales6c9fe692015-02-23 10:44:41 -0800211 ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700212 ASSERT_EQ(0, memcmp(req.auth_token.buffer.get(), deserialized_password->buffer.get(),
Andres Moralesb2abaa82015-03-03 09:09:18 -0800213 password_size));
Andres Morales6c9fe692015-02-23 10:44:41 -0800214}
215
216uint8_t msgbuf[] = {
217 220, 88, 183, 255, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
218 0, 173, 0, 0, 0, 228, 174, 98, 187, 191, 135, 253, 200, 51, 230, 114, 247, 151, 109,
219 237, 79, 87, 32, 94, 5, 204, 46, 154, 30, 91, 6, 103, 148, 254, 129, 65, 171, 228,
220 167, 224, 163, 9, 15, 206, 90, 58, 11, 205, 55, 211, 33, 87, 178, 149, 91, 28, 236,
221 218, 112, 231, 34, 82, 82, 134, 103, 137, 115, 27, 156, 102, 159, 220, 226, 89, 42, 25,
222 37, 9, 84, 239, 76, 161, 198, 72, 167, 163, 39, 91, 148, 191, 17, 191, 87, 169, 179,
223 136, 10, 194, 154, 4, 40, 107, 109, 61, 161, 20, 176, 247, 13, 214, 106, 229, 45, 17,
224 5, 60, 189, 64, 39, 166, 208, 14, 57, 25, 140, 148, 25, 177, 246, 189, 43, 181, 88,
225 204, 29, 126, 224, 100, 143, 93, 60, 57, 249, 55, 0, 87, 83, 227, 224, 166, 59, 214,
226 81, 144, 129, 58, 6, 57, 46, 254, 232, 41, 220, 209, 230, 167, 138, 158, 94, 180, 125,
227 247, 26, 162, 116, 238, 202, 187, 100, 65, 13, 180, 44, 245, 159, 83, 161, 176, 58, 72,
228 236, 109, 105, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
229 0, 11, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0,
230 0, 32, 3, 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0,
231 1, 0, 0, 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112,
232 1, 246, 1, 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145,
233 1, 0, 96, 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0,
234 0, 0, 0, 0, 190, 2, 0, 16, 1, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0,
235 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, 0, 11, 0,
236 0, 0, 98, 0, 0, 0, 1, 0, 0, 32, 2, 0, 0, 0, 1, 0, 0, 32, 3,
237 0, 0, 0, 2, 0, 0, 16, 1, 0, 0, 0, 3, 0, 0, 48, 0, 1, 0, 0,
238 200, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, 0, 244, 1, 0, 112, 1, 246, 1,
239 0, 112, 1, 189, 2, 0, 96, 144, 178, 236, 250, 255, 255, 255, 255, 145, 1, 0, 96,
240 144, 226, 33, 60, 222, 2, 0, 0, 189, 2, 0, 96, 0, 0, 0, 0, 0, 0, 0,
241 0, 190, 2, 0, 16, 1, 0, 0, 0,
242};
243
244
245/*
246 * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
247 * the result will be a crash. This is especially informative when run under Valgrind memcheck.
248 */
249
250template <typename Message> void parse_garbage() {
251 Message msg;
252 size_t array_length = sizeof(msgbuf) / sizeof(msgbuf[0]);
253 const uint8_t* end = msgbuf + array_length;
254 for (size_t i = 0; i < array_length; ++i) {
255 const uint8_t* begin = msgbuf + i;
256 const uint8_t* p = begin;
257 msg.Deserialize(p, end);
258 }
259}
260
261#define GARBAGE_TEST(Message) \
262 TEST(GarbageTest, Message) { parse_garbage<Message>(); }
263
264GARBAGE_TEST(VerifyRequest);
265GARBAGE_TEST(VerifyResponse);
266GARBAGE_TEST(EnrollRequest);
267GARBAGE_TEST(EnrollResponse);