diff --git a/src/fido/ctap.h b/src/fido/ctap.h new file mode 100644 index 0000000..7428582 --- /dev/null +++ b/src/fido/ctap.h @@ -0,0 +1,128 @@ +/* + * This file is part of the Pico HSM SDK distribution (https://github.com/polhenarejos/pico-hsm-sdk). + * Copyright (c) 2022 Pol Henarejos. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _CTAP_H_ +#define _CTAP_H_ + +#ifdef _MSC_VER // Windows +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long int uint64_t; +#else +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// General constants + +#define CTAP_EC_KEY_SIZE 32 // EC key size in bytes +#define CTAP_EC_POINT_SIZE ((CTAP_EC_KEY_SIZE * 2) + 1) // Size of EC point +#define CTAP_MAX_KH_SIZE 128 // Max size of key handle +#define CTAP_MAX_ATT_CERT_SIZE 2048 // Max size of attestation certificate +#define CTAP_MAX_EC_SIG_SIZE 72 // Max size of DER coded EC signature +#define CTAP_CTR_SIZE 4 // Size of counter field +#define CTAP_APPID_SIZE 32 // Size of application id +#define CTAP_CHAL_SIZE 32 // Size of challenge + +#define ENC_SIZE(x) ((x + 7) & 0xfff8) + +// EC (uncompressed) point + +#define CTAP_POINT_UNCOMPRESSED 0x04 // Uncompressed point format + +typedef struct { + uint8_t pointFormat; // Point type + uint8_t x[CTAP_EC_KEY_SIZE]; // X-value + uint8_t y[CTAP_EC_KEY_SIZE]; // Y-value +} CTAP_EC_POINT; + +// CTAP MSG commands + +#define CTAP_REGISTER 0x01 // Registration command +#define CTAP_AUTHENTICATE 0x02 // Authenticate/sign command +#define CTAP_VERSION 0x03 // Read version string command + +// CTAP CBOR commands + +#define CTAP_MAKE_CREDENTIAL 0x01 +#define CTAP_GET_ASSERTION 0x02 +#define CTAP_GET_INFO 0x04 +#define CTAP_CLIENT_PIN 0x06 +#define CTAP_RESET 0x07 +#define CTAP_GET_NEXT_ASSERTION 0x08 + +#define CTAP_VENDOR_FIRST 0x40 // First vendor defined command +#define CTAP_VENDOR_LAST 0xbf // Last vendor defined command + +// CTAP_CMD_REGISTER command defines + +#define CTAP_REGISTER_ID 0x05 // Version 2 registration identifier +#define CTAP_REGISTER_HASH_ID 0x00 // Version 2 hash identintifier + +typedef struct { + uint8_t chal[CTAP_CHAL_SIZE]; // Challenge + uint8_t appId[CTAP_APPID_SIZE]; // Application id +} CTAP_REGISTER_REQ; + +typedef struct { + uint8_t registerId; // Registration identifier (CTAP_REGISTER_ID_V2) + CTAP_EC_POINT pubKey; // Generated public key + uint8_t keyHandleLen; // Length of key handle + uint8_t keyHandleCertSig[ + CTAP_MAX_KH_SIZE + // Key handle + CTAP_MAX_ATT_CERT_SIZE + // Attestation certificate + CTAP_MAX_EC_SIG_SIZE]; // Registration signature +} CTAP_REGISTER_RESP; + +// CTAP_CMD_AUTHENTICATE command defines + +// Authentication control byte + +#define CTAP_AUTH_ENFORCE 0x03 // Enforce user presence and sign +#define CTAP_AUTH_CHECK_ONLY 0x07 // Check only +#define CTAP_AUTH_FLAG_TUP 0x01 // Test of user presence set + +typedef struct { + uint8_t chal[CTAP_CHAL_SIZE]; // Challenge + uint8_t appId[CTAP_APPID_SIZE]; // Application id + uint8_t keyHandleLen; // Length of key handle + uint8_t keyHandle[CTAP_MAX_KH_SIZE]; // Key handle +} CTAP_AUTHENTICATE_REQ; + +typedef struct { + uint8_t flags; // CTAP_AUTH_FLAG_ values + uint8_t ctr[CTAP_CTR_SIZE]; // Counter field (big-endian) + uint8_t sig[CTAP_MAX_EC_SIG_SIZE]; // Signature +} CTAP_AUTHENTICATE_RESP; + +// Command status responses + +#define CTAP_SW_NO_ERROR 0x9000 // SW_NO_ERROR +#define CTAP_SW_WRONG_DATA 0x6A80 // SW_WRONG_DATA +#define CTAP_SW_CONDITIONS_NOT_SATISFIED 0x6985 // SW_CONDITIONS_NOT_SATISFIED +#define CTAP_SW_COMMAND_NOT_ALLOWED 0x6986 // SW_COMMAND_NOT_ALLOWED +#define CTAP_SW_INS_NOT_SUPPORTED 0x6D00 // SW_INS_NOT_SUPPORTED + +#ifdef __cplusplus +} +#endif + +#endif // _CTAP_H_ diff --git a/src/fido/u2f.h b/src/fido/u2f.h deleted file mode 100644 index 0ca7f2e..0000000 --- a/src/fido/u2f.h +++ /dev/null @@ -1,107 +0,0 @@ -// Common U2F raw message format header - Review Draft -// 2014-10-08 -// Editor: Jakob Ehrensvard, Yubico, jakob@yubico.com - -#ifndef __U2F_H_INCLUDED__ -#define __U2F_H_INCLUDED__ - -#ifdef _MSC_VER // Windows -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long int uint64_t; -#else -#include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -// General constants - -#define U2F_EC_KEY_SIZE 32 // EC key size in bytes -#define U2F_EC_POINT_SIZE ((U2F_EC_KEY_SIZE * 2) + 1) // Size of EC point -#define U2F_MAX_KH_SIZE 128 // Max size of key handle -#define U2F_MAX_ATT_CERT_SIZE 2048 // Max size of attestation certificate -#define U2F_MAX_EC_SIG_SIZE 72 // Max size of DER coded EC signature -#define U2F_CTR_SIZE 4 // Size of counter field -#define U2F_APPID_SIZE 32 // Size of application id -#define U2F_CHAL_SIZE 32 // Size of challenge - -#define ENC_SIZE(x) ((x + 7) & 0xfff8) - -// EC (uncompressed) point - -#define U2F_POINT_UNCOMPRESSED 0x04 // Uncompressed point format - -typedef struct { - uint8_t pointFormat; // Point type - uint8_t x[U2F_EC_KEY_SIZE]; // X-value - uint8_t y[U2F_EC_KEY_SIZE]; // Y-value -} U2F_EC_POINT; - -// U2F native commands - -#define U2F_REGISTER 0x01 // Registration command -#define U2F_AUTHENTICATE 0x02 // Authenticate/sign command -#define U2F_VERSION 0x03 // Read version string command - -#define U2F_VENDOR_FIRST 0x40 // First vendor defined command -#define U2F_VENDOR_LAST 0xbf // Last vendor defined command - -// U2F_CMD_REGISTER command defines - -#define U2F_REGISTER_ID 0x05 // Version 2 registration identifier -#define U2F_REGISTER_HASH_ID 0x00 // Version 2 hash identintifier - -typedef struct { - uint8_t chal[U2F_CHAL_SIZE]; // Challenge - uint8_t appId[U2F_APPID_SIZE]; // Application id -} U2F_REGISTER_REQ; - -typedef struct { - uint8_t registerId; // Registration identifier (U2F_REGISTER_ID_V2) - U2F_EC_POINT pubKey; // Generated public key - uint8_t keyHandleLen; // Length of key handle - uint8_t keyHandleCertSig[ - U2F_MAX_KH_SIZE + // Key handle - U2F_MAX_ATT_CERT_SIZE + // Attestation certificate - U2F_MAX_EC_SIG_SIZE]; // Registration signature -} U2F_REGISTER_RESP; - -// U2F_CMD_AUTHENTICATE command defines - -// Authentication control byte - -#define U2F_AUTH_ENFORCE 0x03 // Enforce user presence and sign -#define U2F_AUTH_CHECK_ONLY 0x07 // Check only -#define U2F_AUTH_FLAG_TUP 0x01 // Test of user presence set - -typedef struct { - uint8_t chal[U2F_CHAL_SIZE]; // Challenge - uint8_t appId[U2F_APPID_SIZE]; // Application id - uint8_t keyHandleLen; // Length of key handle - uint8_t keyHandle[U2F_MAX_KH_SIZE]; // Key handle -} U2F_AUTHENTICATE_REQ; - -typedef struct { - uint8_t flags; // U2F_AUTH_FLAG_ values - uint8_t ctr[U2F_CTR_SIZE]; // Counter field (big-endian) - uint8_t sig[U2F_MAX_EC_SIG_SIZE]; // Signature -} U2F_AUTHENTICATE_RESP; - -// Command status responses - -#define U2F_SW_NO_ERROR 0x9000 // SW_NO_ERROR -#define U2F_SW_WRONG_DATA 0x6A80 // SW_WRONG_DATA -#define U2F_SW_CONDITIONS_NOT_SATISFIED 0x6985 // SW_CONDITIONS_NOT_SATISFIED -#define U2F_SW_COMMAND_NOT_ALLOWED 0x6986 // SW_COMMAND_NOT_ALLOWED -#define U2F_SW_INS_NOT_SUPPORTED 0x6D00 // SW_INS_NOT_SUPPORTED - -#ifdef __cplusplus -} -#endif - -#endif // __U2F_H_INCLUDED__ -