1 /* 2 * Copyright (c) 2015-2022, Arm Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #ifndef CRYPTO_MOD_H 8 #define CRYPTO_MOD_H 9 10 #define CRYPTO_AUTH_VERIFY_ONLY 1 11 #define CRYPTO_HASH_CALC_ONLY 2 12 #define CRYPTO_AUTH_VERIFY_AND_HASH_CALC 3 13 14 /* Return values */ 15 enum crypto_ret_value { 16 CRYPTO_SUCCESS = 0, 17 CRYPTO_ERR_INIT, 18 CRYPTO_ERR_HASH, 19 CRYPTO_ERR_SIGNATURE, 20 CRYPTO_ERR_DECRYPTION, 21 CRYPTO_ERR_UNKNOWN 22 }; 23 24 #define CRYPTO_MAX_IV_SIZE 16U 25 #define CRYPTO_MAX_TAG_SIZE 16U 26 27 /* Decryption algorithm */ 28 enum crypto_dec_algo { 29 CRYPTO_GCM_DECRYPT = 0 30 }; 31 32 /* Message digest algorithm */ 33 enum crypto_md_algo { 34 CRYPTO_MD_SHA256, 35 CRYPTO_MD_SHA384, 36 CRYPTO_MD_SHA512, 37 }; 38 39 /* Maximum size as per the known stronger hash algorithm i.e.SHA512 */ 40 #define CRYPTO_MD_MAX_SIZE 64U 41 42 /* 43 * Cryptographic library descriptor 44 */ 45 typedef struct crypto_lib_desc_s { 46 const char *name; 47 48 /* Initialize library. This function is not expected to fail. All errors 49 * must be handled inside the function, asserting or panicing in case of 50 * a non-recoverable error */ 51 void (*init)(void); 52 53 /* Verify a digital signature. Return one of the 54 * 'enum crypto_ret_value' options */ 55 #if CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_ONLY || \ 56 CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC 57 int (*verify_signature)(void *data_ptr, unsigned int data_len, 58 void *sig_ptr, unsigned int sig_len, 59 void *sig_alg, unsigned int sig_alg_len, 60 void *pk_ptr, unsigned int pk_len); 61 62 /* Verify a hash. Return one of the 'enum crypto_ret_value' options */ 63 int (*verify_hash)(void *data_ptr, unsigned int data_len, 64 void *digest_info_ptr, unsigned int digest_info_len); 65 #endif /* CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_ONLY || \ 66 CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC */ 67 68 #if CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY || \ 69 CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC 70 /* Calculate a hash. Return hash value */ 71 int (*calc_hash)(enum crypto_md_algo md_alg, void *data_ptr, 72 unsigned int data_len, 73 unsigned char output[CRYPTO_MD_MAX_SIZE]); 74 #endif /* CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY || \ 75 CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC */ 76 77 /* 78 * Authenticated decryption. Return one of the 79 * 'enum crypto_ret_value' options. 80 */ 81 int (*auth_decrypt)(enum crypto_dec_algo dec_algo, void *data_ptr, 82 size_t len, const void *key, unsigned int key_len, 83 unsigned int key_flags, const void *iv, 84 unsigned int iv_len, const void *tag, 85 unsigned int tag_len); 86 } crypto_lib_desc_t; 87 88 /* Public functions */ 89 #if CRYPTO_SUPPORT 90 void crypto_mod_init(void); 91 #else 92 static inline void crypto_mod_init(void) 93 { 94 } 95 #endif /* CRYPTO_SUPPORT */ 96 97 #if CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_ONLY || \ 98 CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC 99 int crypto_mod_verify_signature(void *data_ptr, unsigned int data_len, 100 void *sig_ptr, unsigned int sig_len, 101 void *sig_alg_ptr, unsigned int sig_alg_len, 102 void *pk_ptr, unsigned int pk_len); 103 int crypto_mod_verify_hash(void *data_ptr, unsigned int data_len, 104 void *digest_info_ptr, unsigned int digest_info_len); 105 #endif /* CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_ONLY || \ 106 CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC */ 107 108 int crypto_mod_auth_decrypt(enum crypto_dec_algo dec_algo, void *data_ptr, 109 size_t len, const void *key, unsigned int key_len, 110 unsigned int key_flags, const void *iv, 111 unsigned int iv_len, const void *tag, 112 unsigned int tag_len); 113 114 #if CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY || \ 115 CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC 116 int crypto_mod_calc_hash(enum crypto_md_algo alg, void *data_ptr, 117 unsigned int data_len, 118 unsigned char output[CRYPTO_MD_MAX_SIZE]); 119 #endif /* CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY || \ 120 CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC */ 121 122 #if CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC 123 /* Macro to register a cryptographic library */ 124 #define REGISTER_CRYPTO_LIB(_name, _init, _verify_signature, _verify_hash, \ 125 _calc_hash, _auth_decrypt) \ 126 const crypto_lib_desc_t crypto_lib_desc = { \ 127 .name = _name, \ 128 .init = _init, \ 129 .verify_signature = _verify_signature, \ 130 .verify_hash = _verify_hash, \ 131 .calc_hash = _calc_hash, \ 132 .auth_decrypt = _auth_decrypt \ 133 } 134 #elif CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_ONLY 135 #define REGISTER_CRYPTO_LIB(_name, _init, _verify_signature, _verify_hash, \ 136 _auth_decrypt) \ 137 const crypto_lib_desc_t crypto_lib_desc = { \ 138 .name = _name, \ 139 .init = _init, \ 140 .verify_signature = _verify_signature, \ 141 .verify_hash = _verify_hash, \ 142 .auth_decrypt = _auth_decrypt \ 143 } 144 #elif CRYPTO_SUPPORT == CRYPTO_HASH_CALC_ONLY 145 #define REGISTER_CRYPTO_LIB(_name, _init, _calc_hash) \ 146 const crypto_lib_desc_t crypto_lib_desc = { \ 147 .name = _name, \ 148 .init = _init, \ 149 .calc_hash = _calc_hash, \ 150 } 151 #endif /* CRYPTO_SUPPORT == CRYPTO_AUTH_VERIFY_AND_HASH_CALC */ 152 153 extern const crypto_lib_desc_t crypto_lib_desc; 154 155 #endif /* CRYPTO_MOD_H */ 156