Home | History | Annotate | Download | only in tests
      1 /*
      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 <gatekeeper/gatekeeper_messages.h>
     23 
     24 using ::gatekeeper::SizedBuffer;
     25 using ::testing::Test;
     26 using ::gatekeeper::EnrollRequest;
     27 using ::gatekeeper::EnrollResponse;
     28 using ::gatekeeper::VerifyRequest;
     29 using ::gatekeeper::VerifyResponse;
     30 using std::cout;
     31 using std::endl;
     32 
     33 static const uint32_t USER_ID = 3857;
     34 
     35 static SizedBuffer *make_buffer(uint32_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 (uint32_t i = 0; i < size; i++) {
     42         buffer[i] = rand();
     43     }
     44 
     45     result->buffer.reset(buffer);
     46     return result;
     47 }
     48 
     49 TEST(RoundTripTest, EnrollRequestNullEnrolledNullHandle) {
     50     const uint32_t password_size = 512;
     51     SizedBuffer *provided_password = make_buffer(password_size);
     52     const SizedBuffer *deserialized_password;
     53     // create request, serialize, deserialize, and validate
     54     EnrollRequest msg(USER_ID, NULL, provided_password, NULL);
     55     SizedBuffer serialized_msg(msg.GetSerializedSize());
     56     msg.Serialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
     57 
     58     EnrollRequest deserialized_msg;
     59     deserialized_msg.Deserialize(serialized_msg.buffer.get(), serialized_msg.buffer.get()
     60             + serialized_msg.length);
     61 
     62     ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
     63             deserialized_msg.error);
     64 
     65     deserialized_password = &deserialized_msg.provided_password;
     66     ASSERT_EQ(USER_ID, deserialized_msg.user_id);
     67     ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
     68     ASSERT_EQ(0, memcmp(msg.provided_password.buffer.get(), deserialized_password->buffer.get(), password_size));
     69     ASSERT_EQ((uint32_t) 0, deserialized_msg.enrolled_password.length);
     70     ASSERT_EQ(NULL, deserialized_msg.enrolled_password.buffer.get());
     71     ASSERT_EQ((uint32_t) 0, deserialized_msg.password_handle.length);
     72     ASSERT_EQ(NULL, deserialized_msg.password_handle.buffer.get());
     73     delete provided_password;
     74 }
     75 
     76 TEST(RoundTripTest, EnrollRequestEmptyEnrolledEmptyHandle) {
     77     const uint32_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 msg(USER_ID, &handle, provided_password, &enrolled);
     84     SizedBuffer serialized_msg(msg.GetSerializedSize());
     85     msg.Serialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
     86 
     87     EnrollRequest deserialized_msg;
     88     deserialized_msg.Deserialize(serialized_msg.buffer.get(), serialized_msg.buffer.get()
     89             + serialized_msg.length);
     90 
     91     ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
     92             deserialized_msg.error);
     93 
     94     deserialized_password = &deserialized_msg.provided_password;
     95     ASSERT_EQ(USER_ID, deserialized_msg.user_id);
     96     ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
     97     ASSERT_EQ(0, memcmp(msg.provided_password.buffer.get(), deserialized_password->buffer.get(), password_size));
     98     ASSERT_EQ((uint32_t) 0, deserialized_msg.enrolled_password.length);
     99     ASSERT_EQ(NULL, deserialized_msg.enrolled_password.buffer.get());
    100     ASSERT_EQ((uint32_t) 0, deserialized_msg.password_handle.length);
    101     ASSERT_EQ(NULL, deserialized_msg.password_handle.buffer.get());
    102     delete provided_password;
    103 }
    104 
    105 TEST(RoundTripTest, EnrollRequestNonNullEnrolledOrHandle) {
    106     const uint32_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 msg(USER_ID, password_handle, provided_password, enrolled_password);
    115     SizedBuffer serialized_msg(msg.GetSerializedSize());
    116     msg.Serialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    117 
    118     EnrollRequest deserialized_msg;
    119     deserialized_msg.Deserialize(serialized_msg.buffer.get(), serialized_msg.buffer.get()
    120             + serialized_msg.length);
    121 
    122     ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
    123             deserialized_msg.error);
    124 
    125     deserialized_password = &deserialized_msg.provided_password;
    126     deserialized_enrolled = &deserialized_msg.enrolled_password;
    127     deserialized_handle = &deserialized_msg.password_handle;
    128     ASSERT_EQ(USER_ID, deserialized_msg.user_id);
    129     ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
    130     ASSERT_EQ(0, memcmp(msg.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(msg.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(msg.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 
    141 TEST(RoundTripTest, EnrollResponse) {
    142     const uint32_t password_size = 512;
    143     SizedBuffer *enrolled_password = make_buffer(password_size);
    144     const SizedBuffer *deserialized_password;
    145     // create request, serialize, deserialize, and validate
    146     EnrollResponse msg(USER_ID, enrolled_password);
    147     SizedBuffer serialized_msg(msg.GetSerializedSize());
    148     msg.Serialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    149 
    150     EnrollResponse deserialized_msg;
    151     deserialized_msg.Deserialize(serialized_msg.buffer.get(), serialized_msg.buffer.get()
    152             + serialized_msg.length);
    153 
    154     ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
    155             deserialized_msg.error);
    156 
    157     deserialized_password = &deserialized_msg.enrolled_password_handle;
    158     ASSERT_EQ(USER_ID, deserialized_msg.user_id);
    159     ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
    160     ASSERT_EQ(0, memcmp(msg.enrolled_password_handle.buffer.get(),
    161                 deserialized_password->buffer.get(), password_size));
    162 }
    163 
    164 TEST(RoundTripTest, VerifyRequest) {
    165     const uint32_t password_size = 512;
    166     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
    170     VerifyRequest msg(USER_ID, 1, password_handle, provided_password);
    171     SizedBuffer serialized_msg(msg.GetSerializedSize());
    172     msg.Serialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    173 
    174     VerifyRequest deserialized_msg;
    175     deserialized_msg.Deserialize(serialized_msg.buffer.get(), serialized_msg.buffer.get()
    176             + serialized_msg.length);
    177 
    178     ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
    179             deserialized_msg.error);
    180 
    181     ASSERT_EQ(USER_ID, deserialized_msg.user_id);
    182     ASSERT_EQ((uint64_t) 1, deserialized_msg.challenge);
    183     deserialized_password = &deserialized_msg.password_handle;
    184     ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
    185     ASSERT_EQ(0, memcmp(msg.provided_password.buffer.get(), deserialized_password->buffer.get(),
    186                 password_size));
    187 
    188     deserialized_password = &deserialized_msg.password_handle;
    189     ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
    190     ASSERT_EQ(0, memcmp(msg.password_handle.buffer.get(), deserialized_password->buffer.get(),
    191                 password_size));
    192 }
    193 
    194 TEST(RoundTripTest, VerifyResponse) {
    195     const uint32_t password_size = 512;
    196     SizedBuffer *auth_token = make_buffer(password_size);
    197     const SizedBuffer *deserialized_password;
    198     // create request, serialize, deserialize, and validate
    199     VerifyResponse msg(USER_ID, auth_token);
    200     SizedBuffer serialized_msg(msg.GetSerializedSize());
    201     msg.Serialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    202 
    203     VerifyResponse deserialized_msg;
    204     deserialized_msg.Deserialize(serialized_msg.buffer.get(), serialized_msg.buffer.get()
    205             + serialized_msg.length);
    206 
    207     ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_NONE,
    208             deserialized_msg.error);
    209 
    210     ASSERT_EQ(USER_ID, deserialized_msg.user_id);
    211     deserialized_password = &deserialized_msg.auth_token;
    212     ASSERT_EQ((uint32_t) password_size, deserialized_password->length);
    213     ASSERT_EQ(0, memcmp(msg.auth_token.buffer.get(), deserialized_password->buffer.get(),
    214                 password_size));
    215 }
    216 
    217 TEST(RoundTripTest, VerifyResponseError) {
    218     VerifyResponse msg;
    219     msg.error = gatekeeper::gatekeeper_error_t::ERROR_INVALID;
    220     SizedBuffer serialized_msg(msg.GetSerializedSize());
    221     msg.Serialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    222     VerifyResponse deserialized_msg;
    223     deserialized_msg.Deserialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    224     ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_INVALID,
    225             deserialized_msg.error);
    226 }
    227 
    228 TEST(RoundTripTest, VerifyRequestError) {
    229     VerifyRequest msg;
    230     msg.error = gatekeeper::gatekeeper_error_t::ERROR_INVALID;
    231     SizedBuffer serialized_msg(msg.GetSerializedSize());
    232     msg.Serialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    233     VerifyRequest deserialized_msg;
    234     deserialized_msg.Deserialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    235     ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_INVALID,
    236             deserialized_msg.error);
    237 }
    238 
    239 TEST(RoundTripTest, EnrollResponseError) {
    240     EnrollResponse msg;
    241     msg.error = gatekeeper::gatekeeper_error_t::ERROR_INVALID;
    242     SizedBuffer serialized_msg(msg.GetSerializedSize());
    243     msg.Serialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    244     EnrollResponse deserialized_msg;
    245     deserialized_msg.Deserialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    246     ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_INVALID,
    247             deserialized_msg.error);
    248 }
    249 
    250 TEST(RoundTripTest, EnrollRequestError) {
    251     EnrollRequest msg;
    252     msg.error = gatekeeper::gatekeeper_error_t::ERROR_INVALID;
    253     SizedBuffer serialized_msg(msg.GetSerializedSize());
    254     msg.Serialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    255     EnrollRequest deserialized_msg;
    256     deserialized_msg.Deserialize(serialized_msg.buffer.get(), serialized_msg.buffer.get() + serialized_msg.length);
    257     ASSERT_EQ(gatekeeper::gatekeeper_error_t::ERROR_INVALID,
    258             deserialized_msg.error);
    259 }
    260 
    261 uint8_t msgbuf[] = {
    262     220, 88,  183, 255, 71,  1,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    263     0,   173, 0,   0,   0,   228, 174, 98,  187, 191, 135, 253, 200, 51,  230, 114, 247, 151, 109,
    264     237, 79,  87,  32,  94,  5,   204, 46,  154, 30,  91,  6,   103, 148, 254, 129, 65,  171, 228,
    265     167, 224, 163, 9,   15,  206, 90,  58,  11,  205, 55,  211, 33,  87,  178, 149, 91,  28,  236,
    266     218, 112, 231, 34,  82,  82,  134, 103, 137, 115, 27,  156, 102, 159, 220, 226, 89,  42,  25,
    267     37,  9,   84,  239, 76,  161, 198, 72,  167, 163, 39,  91,  148, 191, 17,  191, 87,  169, 179,
    268     136, 10,  194, 154, 4,   40,  107, 109, 61,  161, 20,  176, 247, 13,  214, 106, 229, 45,  17,
    269     5,   60,  189, 64,  39,  166, 208, 14,  57,  25,  140, 148, 25,  177, 246, 189, 43,  181, 88,
    270     204, 29,  126, 224, 100, 143, 93,  60,  57,  249, 55,  0,   87,  83,  227, 224, 166, 59,  214,
    271     81,  144, 129, 58,  6,   57,  46,  254, 232, 41,  220, 209, 230, 167, 138, 158, 94,  180, 125,
    272     247, 26,  162, 116, 238, 202, 187, 100, 65,  13,  180, 44,  245, 159, 83,  161, 176, 58,  72,
    273     236, 109, 105, 160, 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
    274     0,   11,  0,   0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,
    275     0,   32,  3,   0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,
    276     1,   0,   0,   200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112,
    277     1,   246, 1,   0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145,
    278     1,   0,   96,  144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,
    279     0,   0,   0,   0,   190, 2,   0,   16,  1,   0,   0,   0,   12,  0,   0,   0,   0,   0,   0,
    280     0,   0,   0,   0,   0,   0,   0,   0,   0,   110, 0,   0,   0,   0,   0,   0,   0,   11,  0,
    281     0,   0,   98,  0,   0,   0,   1,   0,   0,   32,  2,   0,   0,   0,   1,   0,   0,   32,  3,
    282     0,   0,   0,   2,   0,   0,   16,  1,   0,   0,   0,   3,   0,   0,   48,  0,   1,   0,   0,
    283     200, 0,   0,   80,  3,   0,   0,   0,   0,   0,   0,   0,   244, 1,   0,   112, 1,   246, 1,
    284     0,   112, 1,   189, 2,   0,   96,  144, 178, 236, 250, 255, 255, 255, 255, 145, 1,   0,   96,
    285     144, 226, 33,  60,  222, 2,   0,   0,   189, 2,   0,   96,  0,   0,   0,   0,   0,   0,   0,
    286     0,   190, 2,   0,   16,  1,   0,   0,   0,
    287 };
    288 
    289 
    290 /*
    291  * These tests don't have any assertions or expectations. They just try to parse garbage, to see if
    292  * the result will be a crash.  This is especially informative when run under Valgrind memcheck.
    293  */
    294 
    295 template <typename Message> void parse_garbage() {
    296     Message msg;
    297     uint32_t array_length = sizeof(msgbuf) / sizeof(msgbuf[0]);
    298     const uint8_t* end = msgbuf + array_length;
    299     for (uint32_t i = 0; i < array_length; ++i) {
    300         const uint8_t* begin = msgbuf + i;
    301         const uint8_t* p = begin;
    302         msg.Deserialize(p, end);
    303     }
    304 }
    305 
    306 #define GARBAGE_TEST(Message)                                                                      \
    307     TEST(GarbageTest, Message) { parse_garbage<Message>(); }
    308 
    309 GARBAGE_TEST(VerifyRequest);
    310 GARBAGE_TEST(VerifyResponse);
    311 GARBAGE_TEST(EnrollRequest);
    312 GARBAGE_TEST(EnrollResponse);
    313