aboutsummaryrefslogtreecommitdiff
path: root/networking/tls.h
blob: 0252b161fccff082b5d7cafe0a94f0f3ffa6ca58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*
 * Copyright (C) 2017 Denys Vlasenko
 *
 * Licensed under GPLv2, see file LICENSE in this source tree.
 */
/* Interface glue between bbox code and minimally tweaked matrixssl
 * code. All C files (matrixssl and bbox (ones which need TLS))
 * include this file, and guaranteed to see a consistent API,
 * defines, types, etc.
 */
#include "libbb.h"

#if !ENABLE_FEATURE_TLS_SCHANNEL
/* Config tweaks */
#define HAVE_NATIVE_INT64
#undef  USE_1024_KEY_SPEED_OPTIMIZATIONS
#undef  USE_2048_KEY_SPEED_OPTIMIZATIONS
#define USE_AES
#undef  USE_AES_CBC_EXTERNAL
#undef  USE_AES_CCM
#undef  USE_AES_GCM
#undef  USE_3DES
#undef  USE_ARC4
#undef  USE_IDEA
#undef  USE_RC2
#undef  USE_SEED
/* pstm: multiprecision numbers */
#undef  DISABLE_PSTM
#if defined(__GNUC__) && defined(__i386__)
  /* PSTM_X86 works correctly. +25 bytes. */
# define PSTM_32BIT
# define PSTM_X86
#endif
#if defined(__GNUC__) && defined(__x86_64__)
  /* PSTM_64BIT + PSTM_X86_64 works correctly, but:
   * +928 bytes if PSTM_64BIT but !PSTM_X86_64
   * +1003 bytes with INNERMUL8 (loop unrolling in pstm_montgomery_reduce())
   * +664 bytes without INNERMUL8
   */
//# define PSTM_64BIT
//# define PSTM_X86_64
#endif
//#if SOME_COND #define PSTM_MIPS, #define PSTM_32BIT
//#if SOME_COND #define PSTM_ARM,  #define PSTM_32BIT

#define PS_SUCCESS              0
#define PS_FAILURE              -1
#define PS_ARG_FAIL             -6      /* Failure due to bad function param */
#define PS_PLATFORM_FAIL        -7      /* Failure as a result of system call error */
#define PS_MEM_FAIL             -8      /* Failure to allocate requested memory */
#define PS_LIMIT_FAIL           -9      /* Failure on sanity/limit tests */
#define PS_UNSUPPORTED_FAIL     -10     /* Unsupported algorithm or operation */

#define PS_TRUE         1
#define PS_FALSE        0

#undef ENDIAN_BIG
#undef ENDIAN_LITTLE
#if BB_BIG_ENDIAN
# define ENDIAN_BIG     1
//#????  ENDIAN_32BITWORD
// controls only STORE32L, which we don't use
#else
# define ENDIAN_LITTLE  1
#endif

typedef uint64_t uint64;
typedef  int64_t  int64;
typedef uint32_t uint32;
typedef  int32_t  int32;
typedef uint16_t uint16;
typedef  int16_t  int16;

//typedef char psPool_t;

//#ifdef PS_PUBKEY_OPTIMIZE_FOR_SMALLER_RAM
#define PS_EXPTMOD_WINSIZE   3
//#ifdef PS_PUBKEY_OPTIMIZE_FOR_FASTER_SPEED
//#define PS_EXPTMOD_WINSIZE 5

#define PUBKEY_TYPE     0x01
#define PRIVKEY_TYPE    0x02

#define AES_BLOCK_SIZE  16

void tls_get_random(void *buf, unsigned len) FAST_FUNC;

#define ALIGNED_long ALIGNED(sizeof(long))
#define xorbuf_aligned_AES_BLOCK_SIZE(dst,src) xorbuf16_aligned_long(dst,src)
#define xorbuf_AES_BLOCK_SIZE(dst,src)         xorbuf16(dst,src)

#define matrixCryptoGetPrngData(buf, len, userPtr) (tls_get_random(buf, len), PS_SUCCESS)

#define psMalloc(pool, size) xmalloc(size)
#define psFree(p, pool)    free(p)
#define psTraceCrypto(msg) bb_simple_error_msg_and_die(msg)

/* Secure zerofill */
#define memset_s(A,B,C,D) memset((A),(C),(D))
/* Constant time memory comparison */
#define memcmpct(s1, s2, len) memcmp((s1), (s2), (len))
#undef  min
#define min(x, y) ((x) < (y) ? (x) : (y))

#include "tls_pstm.h"
#include "tls_aes.h"
#include "tls_aesgcm.h"
#include "tls_rsa.h"

#define EC_CURVE_KEYSIZE   32
#define P256_KEYSIZE       32
#define CURVE25519_KEYSIZE 32

/* Separate keypair generation and premaster computation functions */
void curve_x25519_generate_keypair(
		uint8_t *privkey32, uint8_t *pubkey32) FAST_FUNC;
void curve_x25519_compute_premaster(
		const uint8_t *privkey32, const uint8_t *peerkey32,
		uint8_t *premaster32) FAST_FUNC;

#if ENABLE_SSL_SERVER
void curve_P256_generate_keypair(
		uint8_t *privkey32, uint8_t *pubkey2x32) FAST_FUNC;
void curve_P256_compute_premaster(
		const uint8_t *privkey32, const uint8_t *peerkey2x32,
		uint8_t *premaster32) FAST_FUNC;
#endif

/* Combined operations (for client-side use) */
void curve_x25519_compute_pubkey_and_premaster(
		uint8_t *pubkey32, uint8_t *premaster32,
		const uint8_t *peerkey32) FAST_FUNC;

void curve_P256_compute_pubkey_and_premaster(
		uint8_t *pubkey2x32, uint8_t *premaster32,
		const uint8_t *peerkey2x32) FAST_FUNC;

void curve_P256_compute_pubkey_and_premaster_NEW(
		uint8_t *pubkey2x32, uint8_t *premaster32,
		const uint8_t *peerkey2x32) FAST_FUNC;
#endif