16c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales/*
26c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales * Copyright 2015 The Android Open Source Project
36c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales *
46c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales * Licensed under the Apache License, Version 2.0 (the "License");
56c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales * you may not use this file except in compliance with the License.
66c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales * You may obtain a copy of the License at
76c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales *
86c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales *      http://www.apache.org/licenses/LICENSE-2.0
96c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales *
106c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales * Unless required by applicable law or agreed to in writing, software
116c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales * distributed under the License is distributed on an "AS IS" BASIS,
126c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales * See the License for the specific language governing permissions and
146c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales * limitations under the License.
156c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales *
166c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales */
176c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
187d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales#include <gatekeeper/gatekeeper_messages.h>
196c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
206c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales#include <string.h>
216c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
2211ed52a7139a6c867850113aa19293c05581fcfcAndres Moralesusing namespace std;
23ac80818fd9e477d142dd8ed2f3902ba3757855c9Andres Morales
247d0f0406314df47b7502c3cd72dcefb83ead7132Andres Moralesnamespace gatekeeper {
256c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
266c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales/**
27ac80818fd9e477d142dd8ed2f3902ba3757855c9Andres Morales * Methods for serializing/deserializing SizedBuffers
286c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales */
29ac80818fd9e477d142dd8ed2f3902ba3757855c9Andres Morales
30175eea9a2a921314d1a58c3be0bc57a71bd8e62dAndres Moralesstruct __attribute__((__packed__)) serial_header_t {
318add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales    uint32_t error;
328add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales    uint32_t user_id;
338add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales};
348add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales
3511ed52a7139a6c867850113aa19293c05581fcfcAndres Moralesstatic inline uint32_t serialized_buffer_size(const SizedBuffer &buf) {
3611ed52a7139a6c867850113aa19293c05581fcfcAndres Morales    return sizeof(buf.length) + buf.length;
376c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
386c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
396c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Moralesstatic inline void append_to_buffer(uint8_t **buffer, const SizedBuffer *to_append) {
406c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    memcpy(*buffer, &to_append->length, sizeof(to_append->length));
416c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    *buffer += sizeof(to_append->length);
42edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    if (to_append->length != 0) {
43edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        memcpy(*buffer, to_append->buffer.get(), to_append->length);
44edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        *buffer += to_append->length;
45edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    }
466c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
476c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
487d0f0406314df47b7502c3cd72dcefb83ead7132Andres Moralesstatic inline gatekeeper_error_t read_from_buffer(const uint8_t **buffer, const uint8_t *end,
496c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales        SizedBuffer *target) {
507d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales    if (*buffer + sizeof(target->length) > end) return ERROR_INVALID;
516c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
526c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    memcpy(&target->length, *buffer, sizeof(target->length));
536c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    *buffer += sizeof(target->length);
54edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    if (target->length != 0) {
55edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        const uint8_t *buffer_end = *buffer + target->length;
567d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales        if (buffer_end > end || buffer_end <= *buffer) return ERROR_INVALID;
576c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
58edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        target->buffer.reset(new uint8_t[target->length]);
59edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        memcpy(target->buffer.get(), *buffer, target->length);
60edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        *buffer += target->length;
61edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    }
627d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales    return ERROR_NONE;
636c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
646c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
65ac80818fd9e477d142dd8ed2f3902ba3757855c9Andres Morales
6611ed52a7139a6c867850113aa19293c05581fcfcAndres Moralesuint32_t GateKeeperMessage::GetSerializedSize() const {
677d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales    if (error == ERROR_NONE) {
68aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        uint32_t size = sizeof(serial_header_t) + nonErrorSerializedSize();
69aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        return size;
706c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    } else {
71aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        uint32_t size = sizeof(serial_header_t);
72aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        if (error == ERROR_RETRY) {
73aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales            size += sizeof(retry_timeout);
74aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        }
75aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        return size;
766c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
776c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
786c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
7911ed52a7139a6c867850113aa19293c05581fcfcAndres Moralesuint32_t GateKeeperMessage::Serialize(uint8_t *buffer, const uint8_t *end) const {
8011ed52a7139a6c867850113aa19293c05581fcfcAndres Morales    uint32_t bytes_written = 0;
81175eea9a2a921314d1a58c3be0bc57a71bd8e62dAndres Morales    if (buffer + GetSerializedSize() > end) {
828add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales        return 0;
838add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales    }
848add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales
858add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales    serial_header_t *header = reinterpret_cast<serial_header_t *>(buffer);
867d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales    if (error != ERROR_NONE) {
87aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        if (buffer + sizeof(serial_header_t) > end) return 0;
888add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales        header->error = error;
89aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        header->user_id = user_id;
90aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        bytes_written += sizeof(*header);
91aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        if (error == ERROR_RETRY) {
92aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales            memcpy(buffer + sizeof(serial_header_t), &retry_timeout, sizeof(retry_timeout));
93aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales            bytes_written  += sizeof(retry_timeout);
94aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        }
956c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    } else {
968add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales        if (buffer + sizeof(serial_header_t) + nonErrorSerializedSize() > end)
978add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales            return 0;
988add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales        header->error = error;
998add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales        header->user_id = user_id;
1008add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales        nonErrorSerialize(buffer + sizeof(*header));
1018add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales        bytes_written += sizeof(*header) + nonErrorSerializedSize();
1026c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
1038add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales
1048add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales    return bytes_written;
1056c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
1066c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
1077d0f0406314df47b7502c3cd72dcefb83ead7132Andres Moralesgatekeeper_error_t GateKeeperMessage::Deserialize(const uint8_t *payload, const uint8_t *end) {
1087d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales    if (payload + sizeof(uint32_t) > end) return ERROR_INVALID;
1098add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales    const serial_header_t *header = reinterpret_cast<const serial_header_t *>(payload);
1108add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales    if (header->error == ERROR_NONE) {
1117d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales        if (payload == end) return ERROR_INVALID;
1128add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales        user_id = header->user_id;
1138add7e25559d0f1d3914e5220a52993c7abd7674Andres Morales        error = nonErrorDeserialize(payload + sizeof(*header), end);
114175eea9a2a921314d1a58c3be0bc57a71bd8e62dAndres Morales    } else {
115175eea9a2a921314d1a58c3be0bc57a71bd8e62dAndres Morales        error = static_cast<gatekeeper_error_t>(header->error);
116aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        user_id = header->user_id;
117aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        if (error == ERROR_RETRY) {
118aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales            if (payload + sizeof(serial_header_t) < end) {
119aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales                memcpy(&retry_timeout, payload + sizeof(serial_header_t), sizeof(retry_timeout));
120aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales            } else {
121aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales                retry_timeout = 0;
122aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales            }
123aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        }
1246c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
1256c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
126b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    return error;
1276c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
1286c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
129aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Moralesvoid GateKeeperMessage::SetRetryTimeout(uint32_t retry_timeout) {
130aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales    this->retry_timeout = retry_timeout;
131aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales    this->error = ERROR_RETRY;
132aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales}
1336c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
1346034309d9caa185c406def66bd4a7b71ea4b6409Andres MoralesVerifyRequest::VerifyRequest(uint32_t user_id, uint64_t challenge,
1356034309d9caa185c406def66bd4a7b71ea4b6409Andres Morales        SizedBuffer *enrolled_password_handle, SizedBuffer *provided_password_payload) {
136b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->user_id = user_id;
1376034309d9caa185c406def66bd4a7b71ea4b6409Andres Morales    this->challenge = challenge;
138b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->password_handle.buffer.reset(enrolled_password_handle->buffer.release());
139b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->password_handle.length = enrolled_password_handle->length;
140b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->provided_password.buffer.reset(provided_password_payload->buffer.release());
141b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->provided_password.length = provided_password_payload->length;
1426c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
1436c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
1446c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres MoralesVerifyRequest::VerifyRequest() {
145b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    memset_s(&password_handle, 0, sizeof(password_handle));
146b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    memset_s(&provided_password, 0, sizeof(provided_password));
1476c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
1486c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
1496c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres MoralesVerifyRequest::~VerifyRequest() {
150b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    if (password_handle.buffer.get()) {
151b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        password_handle.buffer.reset();
1526c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
1536c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
154b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    if (provided_password.buffer.get()) {
155b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        memset_s(provided_password.buffer.get(), 0, provided_password.length);
156b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        provided_password.buffer.reset();
1576c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
1586c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
1596c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
16011ed52a7139a6c867850113aa19293c05581fcfcAndres Moralesuint32_t VerifyRequest::nonErrorSerializedSize() const {
1616034309d9caa185c406def66bd4a7b71ea4b6409Andres Morales    return sizeof(challenge) + serialized_buffer_size(password_handle)
1626034309d9caa185c406def66bd4a7b71ea4b6409Andres Morales            + serialized_buffer_size(provided_password);
1636c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
1646c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
1656c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Moralesvoid VerifyRequest::nonErrorSerialize(uint8_t *buffer) const {
1666034309d9caa185c406def66bd4a7b71ea4b6409Andres Morales    memcpy(buffer, &challenge, sizeof(challenge));
1676034309d9caa185c406def66bd4a7b71ea4b6409Andres Morales    buffer += sizeof(challenge);
168b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    append_to_buffer(&buffer, &password_handle);
169b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    append_to_buffer(&buffer, &provided_password);
1706c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
1716c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
1727d0f0406314df47b7502c3cd72dcefb83ead7132Andres Moralesgatekeeper_error_t VerifyRequest::nonErrorDeserialize(const uint8_t *payload, const uint8_t *end) {
1737d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales    gatekeeper_error_t error = ERROR_NONE;
1746c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
175b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    if (password_handle.buffer.get()) {
176b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        password_handle.buffer.reset();
1776c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
1786c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
179b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    if (provided_password.buffer.get()) {
180b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        memset_s(provided_password.buffer.get(), 0, provided_password.length);
181b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        provided_password.buffer.reset();
1826c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
1836c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
1846034309d9caa185c406def66bd4a7b71ea4b6409Andres Morales    memcpy(&challenge, payload, sizeof(challenge));
1856034309d9caa185c406def66bd4a7b71ea4b6409Andres Morales    payload += sizeof(challenge);
1866034309d9caa185c406def66bd4a7b71ea4b6409Andres Morales
187b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    error = read_from_buffer(&payload, end, &password_handle);
1887d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales    if (error != ERROR_NONE) return error;
1896c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
190b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    return read_from_buffer(&payload, end, &provided_password);
1916c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
1926c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
1936c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
194edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres MoralesVerifyResponse::VerifyResponse(uint32_t user_id, SizedBuffer *auth_token) {
195b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->user_id = user_id;
196edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    this->auth_token.buffer.reset(auth_token->buffer.release());
197edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    this->auth_token.length = auth_token->length;
198aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales    this->request_reenroll = false;
1996c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
2006c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
2016c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres MoralesVerifyResponse::VerifyResponse() {
20270a35b8b84dcae0fd80d538153370dcb58c19459Anand Prasad    request_reenroll = false;
203edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    memset_s(&auth_token, 0, sizeof(auth_token));
2046c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales};
2056c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
2066c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres MoralesVerifyResponse::~VerifyResponse() {
207edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    if (auth_token.length > 0) {
208edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        auth_token.buffer.reset();
2096c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
2106c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
2116c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
212edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Moralesvoid VerifyResponse::SetVerificationToken(SizedBuffer *auth_token) {
213edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    this->auth_token.buffer.reset(auth_token->buffer.release());
214edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    this->auth_token.length = auth_token->length;
215ac80818fd9e477d142dd8ed2f3902ba3757855c9Andres Morales}
216ac80818fd9e477d142dd8ed2f3902ba3757855c9Andres Morales
21711ed52a7139a6c867850113aa19293c05581fcfcAndres Moralesuint32_t VerifyResponse::nonErrorSerializedSize() const {
218aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales    return serialized_buffer_size(auth_token) + sizeof(request_reenroll);
2196c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
2206c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
2216c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Moralesvoid VerifyResponse::nonErrorSerialize(uint8_t *buffer) const {
222edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    append_to_buffer(&buffer, &auth_token);
223aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales    memcpy(buffer, &request_reenroll, sizeof(request_reenroll));
2246c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
2256c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
2267d0f0406314df47b7502c3cd72dcefb83ead7132Andres Moralesgatekeeper_error_t VerifyResponse::nonErrorDeserialize(const uint8_t *payload, const uint8_t *end) {
227edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    if (auth_token.buffer.get()) {
228edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        auth_token.buffer.reset();
2296c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
2306c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
231aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales    gatekeeper_error_t err = read_from_buffer(&payload, end, &auth_token);
232aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales    if (err != ERROR_NONE) {
233aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales        return err;
234aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales    }
235aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales
236aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales    memcpy(&request_reenroll, payload, sizeof(request_reenroll));
237aedf605d883b4ebade9c810eb39cbf5125a58c7dAndres Morales    return ERROR_NONE;
2386c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
2396c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
240edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres MoralesEnrollRequest::EnrollRequest(uint32_t user_id, SizedBuffer *password_handle,
241edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        SizedBuffer *provided_password,  SizedBuffer *enrolled_password) {
242b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->user_id = user_id;
243b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->provided_password.buffer.reset(provided_password->buffer.release());
244b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->provided_password.length = provided_password->length;
245edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales
246edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    if (enrolled_password == NULL) {
247edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        this->enrolled_password.buffer.reset();
248edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        this->enrolled_password.length = 0;
249edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    } else {
250edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        this->enrolled_password.buffer.reset(enrolled_password->buffer.release());
251edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        this->enrolled_password.length = enrolled_password->length;
252edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    }
253edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales
254edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    if (password_handle == NULL) {
255edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        this->password_handle.buffer.reset();
256edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        this->password_handle.length = 0;
257edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    } else {
258edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        this->password_handle.buffer.reset(password_handle->buffer.release());
259edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        this->password_handle.length = password_handle->length;
260edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    }
2616c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
2626c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
2636c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres MoralesEnrollRequest::EnrollRequest() {
264b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    memset_s(&provided_password, 0, sizeof(provided_password));
265edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    memset_s(&enrolled_password, 0, sizeof(enrolled_password));
266edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    memset_s(&password_handle, 0, sizeof(password_handle));
2676c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
2686c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
2696c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres MoralesEnrollRequest::~EnrollRequest() {
270b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    if (provided_password.buffer.get()) {
271b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        memset_s(provided_password.buffer.get(), 0, provided_password.length);
272b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        provided_password.buffer.reset();
2736c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
274edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales
275edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    if (enrolled_password.buffer.get()) {
276edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        memset_s(enrolled_password.buffer.get(), 0, enrolled_password.length);
277edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        enrolled_password.buffer.reset();
278edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    }
279edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales
280edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    if (password_handle.buffer.get()) {
281edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        memset_s(password_handle.buffer.get(), 0, password_handle.length);
282edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        password_handle.buffer.reset();
283edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    }
2846c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
2856c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
28611ed52a7139a6c867850113aa19293c05581fcfcAndres Moralesuint32_t EnrollRequest::nonErrorSerializedSize() const {
287edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales   return serialized_buffer_size(provided_password) + serialized_buffer_size(enrolled_password)
288edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales       + serialized_buffer_size(password_handle);
2896c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
2906c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
2916c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Moralesvoid EnrollRequest::nonErrorSerialize(uint8_t *buffer) const {
292b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    append_to_buffer(&buffer, &provided_password);
293edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    append_to_buffer(&buffer, &enrolled_password);
294edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    append_to_buffer(&buffer, &password_handle);
2956c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
2966c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
2977d0f0406314df47b7502c3cd72dcefb83ead7132Andres Moralesgatekeeper_error_t EnrollRequest::nonErrorDeserialize(const uint8_t *payload, const uint8_t *end) {
2987d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales    gatekeeper_error_t ret;
299b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    if (provided_password.buffer.get()) {
300b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        memset_s(provided_password.buffer.get(), 0, provided_password.length);
301b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        provided_password.buffer.reset();
3026c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
3036c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
304edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    if (enrolled_password.buffer.get()) {
305edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        memset_s(enrolled_password.buffer.get(), 0, enrolled_password.length);
306edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        enrolled_password.buffer.reset();
307edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    }
308edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales
309edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    if (password_handle.buffer.get()) {
310edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        memset_s(password_handle.buffer.get(), 0, password_handle.length);
311edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales        password_handle.buffer.reset();
312edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales    }
313edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales
314edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales     ret = read_from_buffer(&payload, end, &provided_password);
3157d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales     if (ret != ERROR_NONE) {
316edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales         return ret;
317edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales     }
318edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales
319edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales     ret = read_from_buffer(&payload, end, &enrolled_password);
3207d0f0406314df47b7502c3cd72dcefb83ead7132Andres Morales     if (ret != ERROR_NONE) {
321edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales         return ret;
322edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales     }
323edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales
324edd3e3dc860ff3d99c0320a6ee7d66347b4dd1c3Andres Morales     return read_from_buffer(&payload, end, &password_handle);
3256c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
3266c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
327ac80818fd9e477d142dd8ed2f3902ba3757855c9Andres MoralesEnrollResponse::EnrollResponse(uint32_t user_id, SizedBuffer *enrolled_password_handle) {
328b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->user_id = user_id;
329b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->enrolled_password_handle.buffer.reset(enrolled_password_handle->buffer.release());
330b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->enrolled_password_handle.length = enrolled_password_handle->length;
3316c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
3326c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
3336c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres MoralesEnrollResponse::EnrollResponse() {
334b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    memset_s(&enrolled_password_handle, 0, sizeof(enrolled_password_handle));
3356c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
3366c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
3376c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres MoralesEnrollResponse::~EnrollResponse() {
338b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    if (enrolled_password_handle.buffer.get()) {
339b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        enrolled_password_handle.buffer.reset();
3406c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
3416c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
3426c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
343ac80818fd9e477d142dd8ed2f3902ba3757855c9Andres Moralesvoid EnrollResponse::SetEnrolledPasswordHandle(SizedBuffer *enrolled_password_handle) {
344b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->enrolled_password_handle.buffer.reset(enrolled_password_handle->buffer.release());
345b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    this->enrolled_password_handle.length = enrolled_password_handle->length;
346ac80818fd9e477d142dd8ed2f3902ba3757855c9Andres Morales}
347ac80818fd9e477d142dd8ed2f3902ba3757855c9Andres Morales
34811ed52a7139a6c867850113aa19293c05581fcfcAndres Moralesuint32_t EnrollResponse::nonErrorSerializedSize() const {
349b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    return serialized_buffer_size(enrolled_password_handle);
3506c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
3516c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
3526c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Moralesvoid EnrollResponse::nonErrorSerialize(uint8_t *buffer) const {
353b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    append_to_buffer(&buffer, &enrolled_password_handle);
3546c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
3556c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
3567d0f0406314df47b7502c3cd72dcefb83ead7132Andres Moralesgatekeeper_error_t EnrollResponse::nonErrorDeserialize(const uint8_t *payload, const uint8_t *end) {
357b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    if (enrolled_password_handle.buffer.get()) {
358b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales        enrolled_password_handle.buffer.reset();
3596c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales    }
3606c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
361b2abaa89b8090c7f14048d4404a3eb146f709a6aAndres Morales    return read_from_buffer(&payload, end, &enrolled_password_handle);
3626c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales}
3636c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
3646c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales};
3656c9fe69766c5a8f0a7d5bd91ac465c625e64b474Andres Morales
366