| // SPDX-License-Identifier: BSD-2-Clause |
| /* LibTomCrypt, modular cryptographic library -- Tom St Denis |
| * |
| * LibTomCrypt is a library that provides various cryptographic |
| * algorithms in a highly modular and flexible manner. |
| * |
| * The library is free for all purposes without any express |
| * guarantee it works. |
| */ |
| #include "tomcrypt_private.h" |
| |
| /** |
| @file crypt_constants.c |
| |
| Make various constants available to dynamic languages |
| like Python - Larry Bugbee, February 2013 |
| |
| LB - Dec 2013 - revised to include compiler define options |
| LB - Mar 2014 - added endianness and word size |
| */ |
| |
| typedef struct { |
| const char *name; |
| const int value; |
| } crypt_constant; |
| |
| #define _C_STRINGIFY(s) { #s, s } |
| |
| static const crypt_constant _crypt_constants[] = { |
| |
| _C_STRINGIFY(CRYPT_OK), |
| _C_STRINGIFY(CRYPT_ERROR), |
| _C_STRINGIFY(CRYPT_NOP), |
| _C_STRINGIFY(CRYPT_INVALID_KEYSIZE), |
| _C_STRINGIFY(CRYPT_INVALID_ROUNDS), |
| _C_STRINGIFY(CRYPT_FAIL_TESTVECTOR), |
| _C_STRINGIFY(CRYPT_BUFFER_OVERFLOW), |
| _C_STRINGIFY(CRYPT_INVALID_PACKET), |
| _C_STRINGIFY(CRYPT_INVALID_PRNGSIZE), |
| _C_STRINGIFY(CRYPT_ERROR_READPRNG), |
| _C_STRINGIFY(CRYPT_INVALID_CIPHER), |
| _C_STRINGIFY(CRYPT_INVALID_HASH), |
| _C_STRINGIFY(CRYPT_INVALID_PRNG), |
| _C_STRINGIFY(CRYPT_MEM), |
| _C_STRINGIFY(CRYPT_PK_TYPE_MISMATCH), |
| _C_STRINGIFY(CRYPT_PK_NOT_PRIVATE), |
| _C_STRINGIFY(CRYPT_INVALID_ARG), |
| _C_STRINGIFY(CRYPT_FILE_NOTFOUND), |
| _C_STRINGIFY(CRYPT_PK_INVALID_TYPE), |
| _C_STRINGIFY(CRYPT_OVERFLOW), |
| _C_STRINGIFY(CRYPT_PK_ASN1_ERROR), |
| _C_STRINGIFY(CRYPT_INPUT_TOO_LONG), |
| _C_STRINGIFY(CRYPT_PK_INVALID_SIZE), |
| _C_STRINGIFY(CRYPT_INVALID_PRIME_SIZE), |
| _C_STRINGIFY(CRYPT_PK_INVALID_PADDING), |
| _C_STRINGIFY(CRYPT_HASH_OVERFLOW), |
| |
| _C_STRINGIFY(PK_PUBLIC), |
| _C_STRINGIFY(PK_PRIVATE), |
| |
| _C_STRINGIFY(LTC_ENCRYPT), |
| _C_STRINGIFY(LTC_DECRYPT), |
| |
| #ifdef LTC_PKCS_1 |
| {"LTC_PKCS_1", 1}, |
| /* Block types */ |
| _C_STRINGIFY(LTC_PKCS_1_EMSA), |
| _C_STRINGIFY(LTC_PKCS_1_EME), |
| |
| /* Padding types */ |
| _C_STRINGIFY(LTC_PKCS_1_V1_5), |
| _C_STRINGIFY(LTC_PKCS_1_OAEP), |
| _C_STRINGIFY(LTC_PKCS_1_PSS), |
| _C_STRINGIFY(LTC_PKCS_1_V1_5_NA1), |
| #else |
| {"LTC_PKCS_1", 0}, |
| #endif |
| |
| #ifdef LTC_PADDING |
| {"LTC_PADDING", 1}, |
| |
| _C_STRINGIFY(LTC_PAD_PKCS7), |
| #ifdef LTC_RNG_GET_BYTES |
| _C_STRINGIFY(LTC_PAD_ISO_10126), |
| #endif |
| _C_STRINGIFY(LTC_PAD_ANSI_X923), |
| _C_STRINGIFY(LTC_PAD_ONE_AND_ZERO), |
| _C_STRINGIFY(LTC_PAD_ZERO), |
| _C_STRINGIFY(LTC_PAD_ZERO_ALWAYS), |
| #else |
| {"LTC_PADDING", 0}, |
| #endif |
| |
| #ifdef LTC_MRSA |
| {"LTC_MRSA", 1}, |
| #else |
| {"LTC_MRSA", 0}, |
| #endif |
| |
| #ifdef LTC_MECC |
| {"LTC_MECC", 1}, |
| _C_STRINGIFY(ECC_BUF_SIZE), |
| _C_STRINGIFY(ECC_MAXSIZE), |
| #else |
| {"LTC_MECC", 0}, |
| #endif |
| |
| #ifdef LTC_MDSA |
| {"LTC_MDSA", 1}, |
| _C_STRINGIFY(LTC_MDSA_DELTA), |
| _C_STRINGIFY(LTC_MDSA_MAX_GROUP), |
| #else |
| {"LTC_MDSA", 0}, |
| #endif |
| |
| #ifdef LTC_MILLER_RABIN_REPS |
| _C_STRINGIFY(LTC_MILLER_RABIN_REPS), |
| #endif |
| |
| #ifdef LTC_DER |
| /* DER handling */ |
| {"LTC_DER", 1}, |
| _C_STRINGIFY(LTC_ASN1_EOL), |
| _C_STRINGIFY(LTC_ASN1_BOOLEAN), |
| _C_STRINGIFY(LTC_ASN1_INTEGER), |
| _C_STRINGIFY(LTC_ASN1_SHORT_INTEGER), |
| _C_STRINGIFY(LTC_ASN1_BIT_STRING), |
| _C_STRINGIFY(LTC_ASN1_OCTET_STRING), |
| _C_STRINGIFY(LTC_ASN1_NULL), |
| _C_STRINGIFY(LTC_ASN1_OBJECT_IDENTIFIER), |
| _C_STRINGIFY(LTC_ASN1_IA5_STRING), |
| _C_STRINGIFY(LTC_ASN1_PRINTABLE_STRING), |
| _C_STRINGIFY(LTC_ASN1_UTF8_STRING), |
| _C_STRINGIFY(LTC_ASN1_UTCTIME), |
| _C_STRINGIFY(LTC_ASN1_CHOICE), |
| _C_STRINGIFY(LTC_ASN1_SEQUENCE), |
| _C_STRINGIFY(LTC_ASN1_SET), |
| _C_STRINGIFY(LTC_ASN1_SETOF), |
| _C_STRINGIFY(LTC_ASN1_RAW_BIT_STRING), |
| _C_STRINGIFY(LTC_ASN1_TELETEX_STRING), |
| _C_STRINGIFY(LTC_ASN1_GENERALIZEDTIME), |
| _C_STRINGIFY(LTC_ASN1_CUSTOM_TYPE), |
| _C_STRINGIFY(LTC_DER_MAX_RECURSION), |
| #else |
| {"LTC_DER", 0}, |
| #endif |
| |
| #ifdef LTC_CTR_MODE |
| {"LTC_CTR_MODE", 1}, |
| _C_STRINGIFY(CTR_COUNTER_LITTLE_ENDIAN), |
| _C_STRINGIFY(CTR_COUNTER_BIG_ENDIAN), |
| _C_STRINGIFY(LTC_CTR_RFC3686), |
| #else |
| {"LTC_CTR_MODE", 0}, |
| #endif |
| #ifdef LTC_GCM_MODE |
| _C_STRINGIFY(LTC_GCM_MODE_IV), |
| _C_STRINGIFY(LTC_GCM_MODE_AAD), |
| _C_STRINGIFY(LTC_GCM_MODE_TEXT), |
| #endif |
| |
| _C_STRINGIFY(LTC_MP_LT), |
| _C_STRINGIFY(LTC_MP_EQ), |
| _C_STRINGIFY(LTC_MP_GT), |
| |
| _C_STRINGIFY(LTC_MP_NO), |
| _C_STRINGIFY(LTC_MP_YES), |
| |
| _C_STRINGIFY(MAXBLOCKSIZE), |
| _C_STRINGIFY(TAB_SIZE), |
| _C_STRINGIFY(ARGTYPE), |
| |
| #ifdef LTM_DESC |
| {"LTM_DESC", 1}, |
| #else |
| {"LTM_DESC", 0}, |
| #endif |
| #ifdef TFM_DESC |
| {"TFM_DESC", 1}, |
| #else |
| {"TFM_DESC", 0}, |
| #endif |
| #ifdef GMP_DESC |
| {"GMP_DESC", 1}, |
| #else |
| {"GMP_DESC", 0}, |
| #endif |
| |
| #ifdef LTC_FAST |
| {"LTC_FAST", 1}, |
| #else |
| {"LTC_FAST", 0}, |
| #endif |
| |
| #ifdef LTC_NO_FILE |
| {"LTC_NO_FILE", 1}, |
| #else |
| {"LTC_NO_FILE", 0}, |
| #endif |
| |
| #ifdef ENDIAN_LITTLE |
| {"ENDIAN_LITTLE", 1}, |
| #else |
| {"ENDIAN_LITTLE", 0}, |
| #endif |
| |
| #ifdef ENDIAN_BIG |
| {"ENDIAN_BIG", 1}, |
| #else |
| {"ENDIAN_BIG", 0}, |
| #endif |
| |
| #ifdef ENDIAN_32BITWORD |
| {"ENDIAN_32BITWORD", 1}, |
| #else |
| {"ENDIAN_32BITWORD", 0}, |
| #endif |
| |
| #ifdef ENDIAN_64BITWORD |
| {"ENDIAN_64BITWORD", 1}, |
| #else |
| {"ENDIAN_64BITWORD", 0}, |
| #endif |
| |
| #ifdef ENDIAN_NEUTRAL |
| {"ENDIAN_NEUTRAL", 1}, |
| #else |
| {"ENDIAN_NEUTRAL", 0}, |
| #endif |
| }; |
| |
| |
| /* crypt_get_constant() |
| * valueout will be the value of the named constant |
| * return -1 if named item not found |
| */ |
| int crypt_get_constant(const char* namein, int *valueout) { |
| int i; |
| int _crypt_constants_len = sizeof(_crypt_constants) / sizeof(_crypt_constants[0]); |
| for (i=0; i<_crypt_constants_len; i++) { |
| if (XSTRCMP(_crypt_constants[i].name, namein) == 0) { |
| *valueout = _crypt_constants[i].value; |
| return 0; |
| } |
| } |
| return 1; |
| } |
| |
| /* crypt_list_all_constants() |
| * if names_list is NULL, names_list_size will be the minimum |
| * number of bytes needed to receive the complete names_list |
| * if names_list is NOT NULL, names_list must be the addr of |
| * sufficient memory allocated into which the names_list |
| * is to be written. Also, the value in names_list_size |
| * sets the upper bound of the number of characters to be |
| * written. |
| * a -1 return value signifies insufficient space made available |
| */ |
| int crypt_list_all_constants(char *names_list, unsigned int *names_list_size) { |
| int i; |
| unsigned int total_len = 0; |
| char *ptr; |
| int number_len; |
| int count = sizeof(_crypt_constants) / sizeof(_crypt_constants[0]); |
| |
| /* calculate amount of memory required for the list */ |
| for (i=0; i<count; i++) { |
| number_len = snprintf(NULL, 0, "%s,%d\n", _crypt_constants[i].name, _crypt_constants[i].value); |
| if (number_len < 0) { |
| return -1; |
| } |
| total_len += number_len; |
| } |
| |
| if (names_list == NULL) { |
| *names_list_size = total_len; |
| } else { |
| if (total_len > *names_list_size) { |
| return -1; |
| } |
| /* build the names list */ |
| ptr = names_list; |
| for (i=0; i<count; i++) { |
| number_len = snprintf(ptr, total_len, "%s,%d\n", _crypt_constants[i].name, _crypt_constants[i].value); |
| if (number_len < 0) return -1; |
| if ((unsigned int)number_len > total_len) return -1; |
| total_len -= number_len; |
| ptr += number_len; |
| } |
| /* to remove the trailing new-line */ |
| ptr -= 1; |
| *ptr = 0; |
| } |
| return 0; |
| } |
| |
| |
| /* ref: $Format:%D$ */ |
| /* git commit: $Format:%H$ */ |
| /* commit time: $Format:%ai$ */ |