blob: e89ba68aca96da7e84713b37d7d15eb61cc39f2d [file] [log] [blame]
Andres Morales6c9fe692015-02-23 10:44:41 -08001/*
2 * Copyright 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 *
Andres Morales6c9fe692015-02-23 10:44:41 -080016 */
17
Andres Morales7d0f0402015-03-19 18:02:55 -070018#include <gatekeeper/gatekeeper_messages.h>
Andres Morales6c9fe692015-02-23 10:44:41 -080019
20#include <string.h>
21
Andres Morales11ed52a2015-03-30 16:47:47 -070022using namespace std;
Andres Moralesac808182015-02-26 14:11:04 -080023
Andres Morales7d0f0402015-03-19 18:02:55 -070024namespace gatekeeper {
Andres Morales6c9fe692015-02-23 10:44:41 -080025
26/**
Andres Moralesac808182015-02-26 14:11:04 -080027 * Methods for serializing/deserializing SizedBuffers
Andres Morales6c9fe692015-02-23 10:44:41 -080028 */
Andres Morales6c9fe692015-02-23 10:44:41 -080029
Andres Morales175eea92015-03-25 18:01:05 -070030struct __attribute__((__packed__)) serial_header_t {
Andres Morales8add7e22015-03-24 11:10:42 -070031 uint32_t error;
32 uint32_t user_id;
33};
34
Andres Morales11ed52a2015-03-30 16:47:47 -070035static inline uint32_t serialized_buffer_size(const SizedBuffer &buf) {
36 return sizeof(buf.length) + buf.length;
Andres Morales6c9fe692015-02-23 10:44:41 -080037}
38
39static inline void append_to_buffer(uint8_t **buffer, const SizedBuffer *to_append) {
40 memcpy(*buffer, &to_append->length, sizeof(to_append->length));
41 *buffer += sizeof(to_append->length);
Andres Moralesedd3e3d2015-03-12 13:30:15 -070042 if (to_append->length != 0) {
43 memcpy(*buffer, to_append->buffer.get(), to_append->length);
44 *buffer += to_append->length;
45 }
Andres Morales6c9fe692015-02-23 10:44:41 -080046}
47
Andres Morales7d0f0402015-03-19 18:02:55 -070048static inline gatekeeper_error_t read_from_buffer(const uint8_t **buffer, const uint8_t *end,
Andres Morales6c9fe692015-02-23 10:44:41 -080049 SizedBuffer *target) {
Andres Morales7d0f0402015-03-19 18:02:55 -070050 if (*buffer + sizeof(target->length) > end) return ERROR_INVALID;
Andres Morales6c9fe692015-02-23 10:44:41 -080051
52 memcpy(&target->length, *buffer, sizeof(target->length));
53 *buffer += sizeof(target->length);
Andres Moralesedd3e3d2015-03-12 13:30:15 -070054 if (target->length != 0) {
55 const uint8_t *buffer_end = *buffer + target->length;
Andres Morales7d0f0402015-03-19 18:02:55 -070056 if (buffer_end > end || buffer_end <= *buffer) return ERROR_INVALID;
Andres Morales6c9fe692015-02-23 10:44:41 -080057
Andres Moralesedd3e3d2015-03-12 13:30:15 -070058 target->buffer.reset(new uint8_t[target->length]);
59 memcpy(target->buffer.get(), *buffer, target->length);
60 *buffer += target->length;
61 }
Andres Morales7d0f0402015-03-19 18:02:55 -070062 return ERROR_NONE;
Andres Morales6c9fe692015-02-23 10:44:41 -080063}
64
Andres Moralesac808182015-02-26 14:11:04 -080065
Andres Morales11ed52a2015-03-30 16:47:47 -070066uint32_t GateKeeperMessage::GetSerializedSize() const {
Andres Morales7d0f0402015-03-19 18:02:55 -070067 if (error == ERROR_NONE) {
Andres Moralesac808182015-02-26 14:11:04 -080068 return 2 * sizeof(uint32_t) + nonErrorSerializedSize();
Andres Morales6c9fe692015-02-23 10:44:41 -080069 } else {
70 return sizeof(uint32_t);
71 }
72}
73
Andres Morales11ed52a2015-03-30 16:47:47 -070074uint32_t GateKeeperMessage::Serialize(uint8_t *buffer, const uint8_t *end) const {
75 uint32_t bytes_written = 0;
Andres Morales175eea92015-03-25 18:01:05 -070076 if (buffer + GetSerializedSize() > end) {
Andres Morales8add7e22015-03-24 11:10:42 -070077 return 0;
Andres Morales6c9fe692015-02-23 10:44:41 -080078 }
Andres Morales8add7e22015-03-24 11:10:42 -070079
80 serial_header_t *header = reinterpret_cast<serial_header_t *>(buffer);
81 if (error != ERROR_NONE) {
82 if (buffer + sizeof(error) > end) return 0;
83 header->error = error;
84 bytes_written += sizeof(error);
85 } else {
86 if (buffer + sizeof(serial_header_t) + nonErrorSerializedSize() > end)
87 return 0;
88 header->error = error;
89 header->user_id = user_id;
90 nonErrorSerialize(buffer + sizeof(*header));
91 bytes_written += sizeof(*header) + nonErrorSerializedSize();
92 }
93
94 return bytes_written;
Andres Morales6c9fe692015-02-23 10:44:41 -080095}
96
Andres Morales7d0f0402015-03-19 18:02:55 -070097gatekeeper_error_t GateKeeperMessage::Deserialize(const uint8_t *payload, const uint8_t *end) {
Andres Morales6c9fe692015-02-23 10:44:41 -080098 uint32_t error_value;
Andres Morales7d0f0402015-03-19 18:02:55 -070099 if (payload + sizeof(uint32_t) > end) return ERROR_INVALID;
Andres Morales8add7e22015-03-24 11:10:42 -0700100 const serial_header_t *header = reinterpret_cast<const serial_header_t *>(payload);
101 if (header->error == ERROR_NONE) {
Andres Morales7d0f0402015-03-19 18:02:55 -0700102 if (payload == end) return ERROR_INVALID;
Andres Morales8add7e22015-03-24 11:10:42 -0700103 user_id = header->user_id;
104 error = nonErrorDeserialize(payload + sizeof(*header), end);
Andres Morales175eea92015-03-25 18:01:05 -0700105 } else {
106 error = static_cast<gatekeeper_error_t>(header->error);
Andres Morales6c9fe692015-02-23 10:44:41 -0800107 }
108
Andres Moralesb2abaa82015-03-03 09:09:18 -0800109 return error;
Andres Morales6c9fe692015-02-23 10:44:41 -0800110}
111
112
Andres Moralesac808182015-02-26 14:11:04 -0800113VerifyRequest::VerifyRequest(uint32_t user_id, SizedBuffer *enrolled_password_handle,
Andres Morales6c9fe692015-02-23 10:44:41 -0800114 SizedBuffer *provided_password_payload) {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800115 this->user_id = user_id;
116 this->password_handle.buffer.reset(enrolled_password_handle->buffer.release());
117 this->password_handle.length = enrolled_password_handle->length;
118 this->provided_password.buffer.reset(provided_password_payload->buffer.release());
119 this->provided_password.length = provided_password_payload->length;
Andres Morales6c9fe692015-02-23 10:44:41 -0800120}
121
122VerifyRequest::VerifyRequest() {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800123 memset_s(&password_handle, 0, sizeof(password_handle));
124 memset_s(&provided_password, 0, sizeof(provided_password));
Andres Morales6c9fe692015-02-23 10:44:41 -0800125}
126
127VerifyRequest::~VerifyRequest() {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800128 if (password_handle.buffer.get()) {
129 password_handle.buffer.reset();
Andres Morales6c9fe692015-02-23 10:44:41 -0800130 }
131
Andres Moralesb2abaa82015-03-03 09:09:18 -0800132 if (provided_password.buffer.get()) {
133 memset_s(provided_password.buffer.get(), 0, provided_password.length);
134 provided_password.buffer.reset();
Andres Morales6c9fe692015-02-23 10:44:41 -0800135 }
136}
137
Andres Morales11ed52a2015-03-30 16:47:47 -0700138uint32_t VerifyRequest::nonErrorSerializedSize() const {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800139 return serialized_buffer_size(password_handle) + serialized_buffer_size(provided_password);
Andres Morales6c9fe692015-02-23 10:44:41 -0800140}
141
142void VerifyRequest::nonErrorSerialize(uint8_t *buffer) const {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800143 append_to_buffer(&buffer, &password_handle);
144 append_to_buffer(&buffer, &provided_password);
Andres Morales6c9fe692015-02-23 10:44:41 -0800145}
146
Andres Morales7d0f0402015-03-19 18:02:55 -0700147gatekeeper_error_t VerifyRequest::nonErrorDeserialize(const uint8_t *payload, const uint8_t *end) {
148 gatekeeper_error_t error = ERROR_NONE;
Andres Morales6c9fe692015-02-23 10:44:41 -0800149
Andres Moralesb2abaa82015-03-03 09:09:18 -0800150 if (password_handle.buffer.get()) {
151 password_handle.buffer.reset();
Andres Morales6c9fe692015-02-23 10:44:41 -0800152 }
153
Andres Moralesb2abaa82015-03-03 09:09:18 -0800154 if (provided_password.buffer.get()) {
155 memset_s(provided_password.buffer.get(), 0, provided_password.length);
156 provided_password.buffer.reset();
Andres Morales6c9fe692015-02-23 10:44:41 -0800157 }
158
Andres Moralesb2abaa82015-03-03 09:09:18 -0800159 error = read_from_buffer(&payload, end, &password_handle);
Andres Morales7d0f0402015-03-19 18:02:55 -0700160 if (error != ERROR_NONE) return error;
Andres Morales6c9fe692015-02-23 10:44:41 -0800161
Andres Moralesb2abaa82015-03-03 09:09:18 -0800162 return read_from_buffer(&payload, end, &provided_password);
Andres Morales6c9fe692015-02-23 10:44:41 -0800163
164}
165
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700166VerifyResponse::VerifyResponse(uint32_t user_id, SizedBuffer *auth_token) {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800167 this->user_id = user_id;
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700168 this->auth_token.buffer.reset(auth_token->buffer.release());
169 this->auth_token.length = auth_token->length;
Andres Morales6c9fe692015-02-23 10:44:41 -0800170}
171
172VerifyResponse::VerifyResponse() {
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700173 memset_s(&auth_token, 0, sizeof(auth_token));
Andres Morales6c9fe692015-02-23 10:44:41 -0800174};
175
176VerifyResponse::~VerifyResponse() {
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700177 if (auth_token.length > 0) {
178 auth_token.buffer.reset();
Andres Morales6c9fe692015-02-23 10:44:41 -0800179 }
180}
181
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700182void VerifyResponse::SetVerificationToken(SizedBuffer *auth_token) {
183 this->auth_token.buffer.reset(auth_token->buffer.release());
184 this->auth_token.length = auth_token->length;
Andres Moralesac808182015-02-26 14:11:04 -0800185}
186
Andres Morales11ed52a2015-03-30 16:47:47 -0700187uint32_t VerifyResponse::nonErrorSerializedSize() const {
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700188 return serialized_buffer_size(auth_token);
Andres Morales6c9fe692015-02-23 10:44:41 -0800189}
190
191void VerifyResponse::nonErrorSerialize(uint8_t *buffer) const {
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700192 append_to_buffer(&buffer, &auth_token);
Andres Morales6c9fe692015-02-23 10:44:41 -0800193}
194
Andres Morales7d0f0402015-03-19 18:02:55 -0700195gatekeeper_error_t VerifyResponse::nonErrorDeserialize(const uint8_t *payload, const uint8_t *end) {
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700196 if (auth_token.buffer.get()) {
197 auth_token.buffer.reset();
Andres Morales6c9fe692015-02-23 10:44:41 -0800198 }
199
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700200 return read_from_buffer(&payload, end, &auth_token);
Andres Morales6c9fe692015-02-23 10:44:41 -0800201}
202
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700203EnrollRequest::EnrollRequest(uint32_t user_id, SizedBuffer *password_handle,
204 SizedBuffer *provided_password, SizedBuffer *enrolled_password) {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800205 this->user_id = user_id;
206 this->provided_password.buffer.reset(provided_password->buffer.release());
207 this->provided_password.length = provided_password->length;
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700208
209 if (enrolled_password == NULL) {
210 this->enrolled_password.buffer.reset();
211 this->enrolled_password.length = 0;
212 } else {
213 this->enrolled_password.buffer.reset(enrolled_password->buffer.release());
214 this->enrolled_password.length = enrolled_password->length;
215 }
216
217 if (password_handle == NULL) {
218 this->password_handle.buffer.reset();
219 this->password_handle.length = 0;
220 } else {
221 this->password_handle.buffer.reset(password_handle->buffer.release());
222 this->password_handle.length = password_handle->length;
223 }
Andres Morales6c9fe692015-02-23 10:44:41 -0800224}
225
226EnrollRequest::EnrollRequest() {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800227 memset_s(&provided_password, 0, sizeof(provided_password));
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700228 memset_s(&enrolled_password, 0, sizeof(enrolled_password));
229 memset_s(&password_handle, 0, sizeof(password_handle));
Andres Morales6c9fe692015-02-23 10:44:41 -0800230}
231
232EnrollRequest::~EnrollRequest() {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800233 if (provided_password.buffer.get()) {
234 memset_s(provided_password.buffer.get(), 0, provided_password.length);
235 provided_password.buffer.reset();
Andres Morales6c9fe692015-02-23 10:44:41 -0800236 }
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700237
238 if (enrolled_password.buffer.get()) {
239 memset_s(enrolled_password.buffer.get(), 0, enrolled_password.length);
240 enrolled_password.buffer.reset();
241 }
242
243 if (password_handle.buffer.get()) {
244 memset_s(password_handle.buffer.get(), 0, password_handle.length);
245 password_handle.buffer.reset();
246 }
Andres Morales6c9fe692015-02-23 10:44:41 -0800247}
248
Andres Morales11ed52a2015-03-30 16:47:47 -0700249uint32_t EnrollRequest::nonErrorSerializedSize() const {
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700250 return serialized_buffer_size(provided_password) + serialized_buffer_size(enrolled_password)
251 + serialized_buffer_size(password_handle);
Andres Morales6c9fe692015-02-23 10:44:41 -0800252}
253
254void EnrollRequest::nonErrorSerialize(uint8_t *buffer) const {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800255 append_to_buffer(&buffer, &provided_password);
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700256 append_to_buffer(&buffer, &enrolled_password);
257 append_to_buffer(&buffer, &password_handle);
Andres Morales6c9fe692015-02-23 10:44:41 -0800258}
259
Andres Morales7d0f0402015-03-19 18:02:55 -0700260gatekeeper_error_t EnrollRequest::nonErrorDeserialize(const uint8_t *payload, const uint8_t *end) {
261 gatekeeper_error_t ret;
Andres Moralesb2abaa82015-03-03 09:09:18 -0800262 if (provided_password.buffer.get()) {
263 memset_s(provided_password.buffer.get(), 0, provided_password.length);
264 provided_password.buffer.reset();
Andres Morales6c9fe692015-02-23 10:44:41 -0800265 }
266
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700267 if (enrolled_password.buffer.get()) {
268 memset_s(enrolled_password.buffer.get(), 0, enrolled_password.length);
269 enrolled_password.buffer.reset();
270 }
271
272 if (password_handle.buffer.get()) {
273 memset_s(password_handle.buffer.get(), 0, password_handle.length);
274 password_handle.buffer.reset();
275 }
276
277 ret = read_from_buffer(&payload, end, &provided_password);
Andres Morales7d0f0402015-03-19 18:02:55 -0700278 if (ret != ERROR_NONE) {
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700279 return ret;
280 }
281
282 ret = read_from_buffer(&payload, end, &enrolled_password);
Andres Morales7d0f0402015-03-19 18:02:55 -0700283 if (ret != ERROR_NONE) {
Andres Moralesedd3e3d2015-03-12 13:30:15 -0700284 return ret;
285 }
286
287 return read_from_buffer(&payload, end, &password_handle);
Andres Morales6c9fe692015-02-23 10:44:41 -0800288}
289
Andres Moralesac808182015-02-26 14:11:04 -0800290EnrollResponse::EnrollResponse(uint32_t user_id, SizedBuffer *enrolled_password_handle) {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800291 this->user_id = user_id;
292 this->enrolled_password_handle.buffer.reset(enrolled_password_handle->buffer.release());
293 this->enrolled_password_handle.length = enrolled_password_handle->length;
Andres Morales6c9fe692015-02-23 10:44:41 -0800294}
295
296EnrollResponse::EnrollResponse() {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800297 memset_s(&enrolled_password_handle, 0, sizeof(enrolled_password_handle));
Andres Morales6c9fe692015-02-23 10:44:41 -0800298}
299
300EnrollResponse::~EnrollResponse() {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800301 if (enrolled_password_handle.buffer.get()) {
302 enrolled_password_handle.buffer.reset();
Andres Morales6c9fe692015-02-23 10:44:41 -0800303 }
304}
305
Andres Moralesac808182015-02-26 14:11:04 -0800306void EnrollResponse::SetEnrolledPasswordHandle(SizedBuffer *enrolled_password_handle) {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800307 this->enrolled_password_handle.buffer.reset(enrolled_password_handle->buffer.release());
308 this->enrolled_password_handle.length = enrolled_password_handle->length;
Andres Moralesac808182015-02-26 14:11:04 -0800309}
310
Andres Morales11ed52a2015-03-30 16:47:47 -0700311uint32_t EnrollResponse::nonErrorSerializedSize() const {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800312 return serialized_buffer_size(enrolled_password_handle);
Andres Morales6c9fe692015-02-23 10:44:41 -0800313}
314
315void EnrollResponse::nonErrorSerialize(uint8_t *buffer) const {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800316 append_to_buffer(&buffer, &enrolled_password_handle);
Andres Morales6c9fe692015-02-23 10:44:41 -0800317}
318
Andres Morales7d0f0402015-03-19 18:02:55 -0700319gatekeeper_error_t EnrollResponse::nonErrorDeserialize(const uint8_t *payload, const uint8_t *end) {
Andres Moralesb2abaa82015-03-03 09:09:18 -0800320 if (enrolled_password_handle.buffer.get()) {
321 enrolled_password_handle.buffer.reset();
Andres Morales6c9fe692015-02-23 10:44:41 -0800322 }
323
Andres Moralesb2abaa82015-03-03 09:09:18 -0800324 return read_from_buffer(&payload, end, &enrolled_password_handle);
Andres Morales6c9fe692015-02-23 10:44:41 -0800325}
326
327};
328