ctap_crypto.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2021 Freie Universität Berlin
3  *
4  * This file is subject to the terms and conditions of the GNU Lesser
5  * General Public License v2.1. See the file LICENSE in the top level
6  * directory for more details.
7  */
8 
23 #ifndef FIDO2_CTAP_CTAP_CRYPTO_H
24 #define FIDO2_CTAP_CTAP_CRYPTO_H
25 
26 #include <stdint.h>
27 
28 #include "hashes/sha256.h"
29 #include "fido2/ctap.h"
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
38 #define CTAP_CRYPTO_KEY_SIZE 32
39 
43 #define CTAP_CRYPTO_ES256_DER_MAX_SIZE 72
44 
48 typedef struct {
49  uint8_t x[CTAP_CRYPTO_KEY_SIZE];
50  uint8_t y[CTAP_CRYPTO_KEY_SIZE];
52 
58 typedef struct {
60  uint8_t priv[CTAP_CRYPTO_KEY_SIZE];
62 
71 
80 ctap_status_code_t fido2_ctap_crypto_prng(uint8_t *buf, size_t len);
81 
90 
101 
111 
124 ctap_status_code_t fido2_ctap_crypto_sha256(const void *data, size_t len,
125  void *digest);
126 
137  size_t key_length);
138 
149 
160 
176  size_t key_length, const void *data, size_t len,
177  void *digest);
178 
189 
202  ctap_crypto_pub_key_t *pub_key, uint8_t *priv_key, size_t key_len);
203 
216 ctap_status_code_t fido2_ctap_crypto_get_sig(uint8_t *hash, size_t hash_len, uint8_t *sig,
217  size_t *sig_len, const uint8_t *key, size_t key_len);
218 
231 ctap_status_code_t fido2_ctap_crypto_aes_enc(uint8_t * out, size_t *out_len, uint8_t * in,
232  size_t in_len, const uint8_t * key, size_t key_len);
233 
246 ctap_status_code_t fido2_ctap_crypto_aes_dec(uint8_t * out, size_t *out_len, uint8_t * in,
247  size_t in_len, const uint8_t * key, size_t key_len);
248 
268  const uint8_t *in, size_t in_len,
269  uint8_t *auth_data, size_t auth_data_len,
270  uint8_t mac_len, uint8_t length_encoding,
271  const uint8_t *nonce, size_t nonce_len,
272  const uint8_t *key, size_t key_len);
273 
293  const uint8_t *in, size_t in_len,
294  uint8_t *auth_data, size_t auth_data_len,
295  uint8_t mac_len, uint8_t length_encoding,
296  const uint8_t *nonce, size_t nonce_len,
297  const uint8_t *key, size_t key_len);
298 #ifdef __cplusplus
299 }
300 #endif
301 #endif /* FIDO2_CTAP_CTAP_CRYPTO_H */
Public FIDO2 CTAP defines, structures and function declarations.
ctap_status_code_t fido2_ctap_crypto_prng(uint8_t *buf, size_t len)
Wrapper function for random_bytes.
ctap_status_code_t fido2_ctap_crypto_init(void)
Initialize crypto helper.
ctap_status_code_t fido2_ctap_crypto_hmac_sha256_init(hmac_context_t *ctx, const void *key, size_t key_length)
Wrapper function for hmac_sha256_init.
ctap_status_code_t fido2_ctap_crypto_sha256_update(sha256_context_t *ctx, const void *data, size_t len)
Wrapper function for sha256_update.
ctap_status_code_t fido2_ctap_crypto_hmac_sha256_final(hmac_context_t *ctx, void *digest)
Wrapper function for hmac_sha256_final.
ctap_status_code_t fido2_ctap_crypto_aes_ccm_enc(uint8_t *out, size_t out_len, const uint8_t *in, size_t in_len, uint8_t *auth_data, size_t auth_data_len, uint8_t mac_len, uint8_t length_encoding, const uint8_t *nonce, size_t nonce_len, const uint8_t *key, size_t key_len)
Encrypt data using AES-128-CCM.
ctap_status_code_t fido2_ctap_crypto_sha256(const void *data, size_t len, void *digest)
Wrapper function for sha256.
ctap_status_code_t fido2_ctap_crypto_gen_keypair(ctap_crypto_pub_key_t *pub_key, uint8_t *priv_key, size_t len)
Generate cryptographic key pair.
ctap_status_code_t fido2_ctap_crypto_aes_enc(uint8_t *out, size_t *out_len, uint8_t *in, size_t in_len, const uint8_t *key, size_t key_len)
Encrypt data using AES-256-CBC.
ctap_status_code_t fido2_ctap_crypto_hmac_sha256(const void *key, size_t key_length, const void *data, size_t len, void *digest)
Wrapper function for hmac_sha256.
#define CTAP_CRYPTO_KEY_SIZE
Size in bytes of cryptographic keys used.
Definition: ctap_crypto.h:38
ctap_status_code_t fido2_ctap_crypto_aes_dec(uint8_t *out, size_t *out_len, uint8_t *in, size_t in_len, const uint8_t *key, size_t key_len)
Decrypt data using AES-256-CBC.
ctap_status_code_t fido2_ctap_crypto_sha256_final(sha256_context_t *ctx, void *digest)
Wrapper for sha256_final.
ctap_status_code_t fido2_ctap_crypto_aes_ccm_dec(uint8_t *out, size_t out_len, const uint8_t *in, size_t in_len, uint8_t *auth_data, size_t auth_data_len, uint8_t mac_len, uint8_t length_encoding, const uint8_t *nonce, size_t nonce_len, const uint8_t *key, size_t key_len)
Encrypt data using AES-128-CCM.
ctap_status_code_t fido2_ctap_crypto_hmac_sha256_update(hmac_context_t *ctx, const void *data, size_t len)
Wrapper function for hmac_sha256_update.
ctap_status_code_t fido2_ctap_crypto_ecdh(uint8_t *out, size_t len, ctap_crypto_pub_key_t *pub_key, uint8_t *priv_key, size_t key_len)
Elliptic-curve Diffie-Hellmann.
ctap_status_code_t fido2_ctap_crypto_get_sig(uint8_t *hash, size_t hash_len, uint8_t *sig, size_t *sig_len, const uint8_t *key, size_t key_len)
Create cryptographic signature.
ctap_status_code_t fido2_ctap_crypto_sha256_init(sha256_context_t *ctx)
Wrapper function for sha256_init.
ctap_status_code_t
CTAP status codes.
Definition: ctap.h:47
Header definitions for the SHA256 hash function.
ctap_crypto_pub_key_t pub
public key
Definition: ctap_crypto.h:59
Elliptic curve public key.
Definition: ctap_crypto.h:48
Context for HMAC operations based on sha256.
Definition: sha256.h:77
Structure to hold the SHA-2XX context.
Definition: sha2xx_common.h:62