| /* SPDX-License-Identifier: LGPL-2.1+ */ |
| |
| #include <stdint.h> |
| #include <stdlib.h> |
| |
| #include "fido_id/fido_id_desc.h" |
| #include "macro.h" |
| |
| static void test_is_fido_security_token_desc__fido(void) { |
| static const uint8_t FIDO_HID_DESC_1[] = { |
| 0x06, 0xd0, 0xf1, 0x09, 0x01, 0xa1, 0x01, 0x09, 0x20, 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, |
| 0x08, 0x95, 0x40, 0x81, 0x02, 0x09, 0x21, 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, |
| 0x40, 0x91, 0x02, 0xc0, |
| }; |
| assert_se(is_fido_security_token_desc(FIDO_HID_DESC_1, sizeof(FIDO_HID_DESC_1)) > 0); |
| |
| static const uint8_t FIDO_HID_DESC_2[] = { |
| 0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x05, 0x07, 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00, 0x25, |
| 0x01, 0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x01, 0x95, 0x05, |
| 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05, 0x91, 0x02, 0x95, 0x01, 0x75, 0x03, 0x91, |
| 0x01, 0x95, 0x06, 0x75, 0x08, 0x15, 0x00, 0x25, 0x65, 0x05, 0x07, 0x19, 0x00, 0x29, 0x65, |
| 0x81, 0x00, 0x09, 0x03, 0x75, 0x08, 0x95, 0x08, 0xb1, 0x02, 0xc0, |
| 0x06, 0xd0, 0xf1, 0x09, 0x01, 0xa1, 0x01, 0x09, 0x20, 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, |
| 0x08, 0x95, 0x40, 0x81, 0x02, 0x09, 0x21, 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, |
| 0x40, 0x91, 0x02, 0xc0, |
| }; |
| assert_se(is_fido_security_token_desc(FIDO_HID_DESC_2, sizeof(FIDO_HID_DESC_2)) > 0); |
| } |
| |
| static void test_is_fido_security_token_desc__non_fido(void) { |
| /* Wrong usage page */ |
| static const uint8_t NON_FIDO_HID_DESC_1[] = { |
| 0x06, 0xd0, 0xf0, 0x09, 0x01, 0xa1, 0x01, 0x09, 0x20, 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, |
| 0x08, 0x95, 0x40, 0x81, 0x02, 0x09, 0x21, 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, |
| 0x40, 0x91, 0x02, 0xc0, |
| }; |
| assert_se(is_fido_security_token_desc(NON_FIDO_HID_DESC_1, sizeof(NON_FIDO_HID_DESC_1)) == 0); |
| |
| /* Wrong usage */ |
| static const uint8_t NON_FIDO_HID_DESC_2[] = { |
| 0x06, 0xd0, 0xf1, 0x09, 0x02, 0xa1, 0x01, 0x09, 0x20, 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, |
| 0x08, 0x95, 0x40, 0x81, 0x02, 0x09, 0x21, 0x15, 0x00, 0x26, 0xff, 0x00, 0x75, 0x08, 0x95, |
| 0x40, 0x91, 0x02, 0xc0, |
| }; |
| assert_se(is_fido_security_token_desc(NON_FIDO_HID_DESC_2, sizeof(NON_FIDO_HID_DESC_2)) == 0); |
| |
| static const uint8_t NON_FIDO_HID_DESC_3[] = { |
| 0x05, 0x01, 0x09, 0x06, 0xa1, 0x01, 0x05, 0x07, 0x19, 0xe0, 0x29, 0xe7, 0x15, 0x00, 0x25, |
| 0x01, 0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x95, 0x01, 0x75, 0x08, 0x81, 0x01, 0x95, 0x05, |
| 0x75, 0x01, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05, 0x91, 0x02, 0x95, 0x01, 0x75, 0x03, 0x91, |
| 0x01, 0x95, 0x06, 0x75, 0x08, 0x15, 0x00, 0x25, 0x65, 0x05, 0x07, 0x19, 0x00, 0x29, 0x65, |
| 0x81, 0x00, 0x09, 0x03, 0x75, 0x08, 0x95, 0x08, 0xb1, 0x02, 0xc0, |
| }; |
| assert_se(is_fido_security_token_desc(NON_FIDO_HID_DESC_3, sizeof(NON_FIDO_HID_DESC_3)) == 0); |
| } |
| |
| static void test_is_fido_security_token_desc__invalid(void) { |
| /* Size coded on 1 byte, but no byte given */ |
| static const uint8_t INVALID_HID_DESC_1[] = { 0x01 }; |
| assert_se(is_fido_security_token_desc(INVALID_HID_DESC_1, sizeof(INVALID_HID_DESC_1)) < 0); |
| |
| /* Size coded on 2 bytes, but only 1 byte given */ |
| static const uint8_t INVALID_HID_DESC_2[] = { 0x02, 0x01 }; |
| assert_se(is_fido_security_token_desc(INVALID_HID_DESC_2, sizeof(INVALID_HID_DESC_2)) < 0); |
| |
| /* Size coded on 4 bytes, but only 3 bytes given */ |
| static const uint8_t INVALID_HID_DESC_3[] = { 0x03, 0x01, 0x02, 0x03 }; |
| assert_se(is_fido_security_token_desc(INVALID_HID_DESC_3, sizeof(INVALID_HID_DESC_3)) < 0); |
| |
| /* Long item without a size byte */ |
| static const uint8_t INVALID_HID_DESC_4[] = { 0xfe }; |
| assert_se(is_fido_security_token_desc(INVALID_HID_DESC_4, sizeof(INVALID_HID_DESC_4)) < 0); |
| |
| /* Usage pages are coded on at most 2 bytes */ |
| static const uint8_t INVALID_HID_DESC_5[] = { 0x07, 0x01, 0x02, 0x03, 0x04 }; |
| assert_se(is_fido_security_token_desc(INVALID_HID_DESC_5, sizeof(INVALID_HID_DESC_5)) < 0); |
| } |
| |
| int main(int argc, char *argv[]) { |
| test_is_fido_security_token_desc__fido(); |
| test_is_fido_security_token_desc__non_fido(); |
| test_is_fido_security_token_desc__invalid(); |
| |
| return EXIT_SUCCESS; |
| } |