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