1 /* 2 * Copyright (C) 2017 Denys Vlasenko 3 * 4 * Licensed under GPLv2, see file LICENSE in this source tree. 5 */ 6 /* Interface glue between bbox code and minimally tweaked matrixssl 7 * code. All C files (matrixssl and bbox (ones which need TLS)) 8 * include this file, and guaranteed to see a consistent API, 9 * defines, types, etc. 10 */ 11 #include "libbb.h" 12 13 14 /* Config tweaks */ 15 #define HAVE_NATIVE_INT64 16 #undef USE_1024_KEY_SPEED_OPTIMIZATIONS 17 #undef USE_2048_KEY_SPEED_OPTIMIZATIONS 18 #define USE_AES 19 #undef USE_AES_CBC_EXTERNAL 20 #undef USE_AES_CCM 21 #undef USE_AES_GCM 22 #undef USE_3DES 23 #undef USE_ARC4 24 #undef USE_IDEA 25 #undef USE_RC2 26 #undef USE_SEED 27 /* pstm: multiprecision numbers */ 28 #undef DISABLE_PSTM 29 #if defined(__GNUC__) && defined(__i386__) 30 /* PSTM_X86 works correctly. +25 bytes. */ 31 # define PSTM_32BIT 32 # define PSTM_X86 33 #endif 34 //#if defined(__GNUC__) && defined(__x86_64__) 35 // /* PSTM_X86_64 works correctly, but +782 bytes. */ 36 // /* Looks like most of the growth is because of PSTM_64BIT. */ 37 //# define PSTM_64BIT 38 //# define PSTM_X86_64 39 //#endif 40 //#if SOME_COND #define PSTM_MIPS, #define PSTM_32BIT 41 //#if SOME_COND #define PSTM_ARM, #define PSTM_32BIT 42 43 44 #define PS_SUCCESS 0 45 #define PS_FAILURE -1 46 #define PS_ARG_FAIL -6 /* Failure due to bad function param */ 47 #define PS_PLATFORM_FAIL -7 /* Failure as a result of system call error */ 48 #define PS_MEM_FAIL -8 /* Failure to allocate requested memory */ 49 #define PS_LIMIT_FAIL -9 /* Failure on sanity/limit tests */ 50 51 #define PS_TRUE 1 52 #define PS_FALSE 0 53 54 #if BB_BIG_ENDIAN 55 # define ENDIAN_BIG 1 56 # undef ENDIAN_LITTLE 57 //#???? ENDIAN_32BITWORD 58 // controls only STORE32L, which we don't use 59 #else 60 # define ENDIAN_LITTLE 1 61 # undef ENDIAN_BIG 62 #endif 63 64 typedef uint64_t uint64; 65 typedef int64_t int64; 66 typedef uint32_t uint32; 67 typedef int32_t int32; 68 typedef uint16_t uint16; 69 typedef int16_t int16; 70 71 //typedef char psPool_t; 72 73 //#ifdef PS_PUBKEY_OPTIMIZE_FOR_SMALLER_RAM 74 #define PS_EXPTMOD_WINSIZE 3 75 //#ifdef PS_PUBKEY_OPTIMIZE_FOR_FASTER_SPEED 76 //#define PS_EXPTMOD_WINSIZE 5 77 78 #define PUBKEY_TYPE 0x01 79 #define PRIVKEY_TYPE 0x02 80 81 #define AES_BLOCK_SIZE 16 82 83 void tls_get_random(void *buf, unsigned len) FAST_FUNC; 84 85 void xorbuf(void* buf, const void* mask, unsigned count) FAST_FUNC; 86 87 #define ALIGNED_long ALIGNED(sizeof(long)) 88 void xorbuf_aligned_AES_BLOCK_SIZE(void* buf, const void* mask) FAST_FUNC; 89 90 #define matrixCryptoGetPrngData(buf, len, userPtr) (tls_get_random(buf, len), PS_SUCCESS) 91 92 #define psFree(p, pool) free(p) 93 #define psTraceCrypto(msg) bb_simple_error_msg_and_die(msg) 94 95 /* Secure zerofill */ 96 #define memset_s(A,B,C,D) memset((A),(C),(D)) 97 /* Constant time memory comparison */ 98 #define memcmpct(s1, s2, len) memcmp((s1), (s2), (len)) 99 #undef min 100 #define min(x, y) ((x) < (y) ? (x) : (y)) 101 102 103 #include "tls_pstm.h" 104 #include "tls_aes.h" 105 #include "tls_aesgcm.h" 106 #include "tls_rsa.h" 107 108 #define EC_CURVE_KEYSIZE 32 109 #define P256_KEYSIZE 32 110 #define CURVE25519_KEYSIZE 32 111 112 void curve_x25519_compute_pubkey_and_premaster( 113 uint8_t *pubkey32, uint8_t *premaster32, 114 const uint8_t *peerkey32) FAST_FUNC; 115 116 void curve_P256_compute_pubkey_and_premaster( 117 uint8_t *pubkey2x32, uint8_t *premaster32, 118 const uint8_t *peerkey2x32) FAST_FUNC; 119 120 void curve_P256_compute_pubkey_and_premaster_NEW( 121 uint8_t *pubkey2x32, uint8_t *premaster32, 122 const uint8_t *peerkey2x32) FAST_FUNC; 123