GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libcrypto/crypto/../../libssl/src/crypto/constant_time_locl.h Lines: 0 3 0.0 %
Date: 2016-12-06 Branches: 0 0 0.0 %

Line Branch Exec Source
1
/* crypto/constant_time_locl.h */
2
/*-
3
 * Utilities for constant-time cryptography.
4
 *
5
 * Author: Emilia Kasper (emilia@openssl.org)
6
 * Based on previous work by Bodo Moeller, Emilia Kasper, Adam Langley
7
 * (Google).
8
 * ====================================================================
9
 * Copyright (c) 2014 The OpenSSL Project.  All rights reserved.
10
 *
11
 * Redistribution and use in source and binary forms, with or without
12
 * modification, are permitted provided that the following conditions
13
 * are met:
14
 * 1. Redistributions of source code must retain the copyright
15
 *    notice, this list of conditions and the following disclaimer.
16
 * 2. Redistributions in binary form must reproduce the above copyright
17
 *    notice, this list of conditions and the following disclaimer in the
18
 *    documentation and/or other materials provided with the distribution.
19
 * 3. All advertising materials mentioning features or use of this software
20
 *    must display the following acknowledgement:
21
 *    "This product includes cryptographic software written by
22
 *     Eric Young (eay@cryptsoft.com)"
23
 *    The word 'cryptographic' can be left out if the rouines from the library
24
 *    being used are not cryptographic related :-).
25
 * 4. If you include any Windows specific code (or a derivative thereof) from
26
 *    the apps directory (application code) you must include an acknowledgement:
27
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
28
 *
29
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
30
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
33
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
35
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
38
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39
 * SUCH DAMAGE.
40
 *
41
 * The licence and distribution terms for any publically available version or
42
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
43
 * copied and put under another distribution licence
44
 * [including the GNU Public Licence.]
45
 */
46
47
#ifndef HEADER_CONSTANT_TIME_LOCL_H
48
# define HEADER_CONSTANT_TIME_LOCL_H
49
50
#ifdef __cplusplus
51
extern "C" {
52
#endif
53
54
/*-
55
 * The boolean methods return a bitmask of all ones (0xff...f) for true
56
 * and 0 for false. This is useful for choosing a value based on the result
57
 * of a conditional in constant time. For example,
58
 *
59
 * if (a < b) {
60
 *   c = a;
61
 * } else {
62
 *   c = b;
63
 * }
64
 *
65
 * can be written as
66
 *
67
 * unsigned int lt = constant_time_lt(a, b);
68
 * c = constant_time_select(lt, a, b);
69
 */
70
71
/*
72
 * Returns the given value with the MSB copied to all the other
73
 * bits. Uses the fact that arithmetic shift shifts-in the sign bit.
74
 * However, this is not ensured by the C standard so you may need to
75
 * replace this with something else on odd CPUs.
76
 */
77
static inline unsigned int constant_time_msb(unsigned int a);
78
79
/*
80
 * Returns 0xff..f if a < b and 0 otherwise.
81
 */
82
static inline unsigned int constant_time_lt(unsigned int a, unsigned int b);
83
/* Convenience method for getting an 8-bit mask. */
84
static inline unsigned char constant_time_lt_8(unsigned int a,
85
                                               unsigned int b);
86
87
/*
88
 * Returns 0xff..f if a >= b and 0 otherwise.
89
 */
90
static inline unsigned int constant_time_ge(unsigned int a, unsigned int b);
91
/* Convenience method for getting an 8-bit mask. */
92
static inline unsigned char constant_time_ge_8(unsigned int a,
93
                                               unsigned int b);
94
95
/*
96
 * Returns 0xff..f if a == 0 and 0 otherwise.
97
 */
98
static inline unsigned int constant_time_is_zero(unsigned int a);
99
/* Convenience method for getting an 8-bit mask. */
100
static inline unsigned char constant_time_is_zero_8(unsigned int a);
101
102
/*
103
 * Returns 0xff..f if a == b and 0 otherwise.
104
 */
105
static inline unsigned int constant_time_eq(unsigned int a, unsigned int b);
106
/* Convenience method for getting an 8-bit mask. */
107
static inline unsigned char constant_time_eq_8(unsigned int a,
108
                                               unsigned int b);
109
/* Signed integers. */
110
static inline unsigned int constant_time_eq_int(int a, int b);
111
/* Convenience method for getting an 8-bit mask. */
112
static inline unsigned char constant_time_eq_int_8(int a, int b);
113
114
/*-
115
 * Returns (mask & a) | (~mask & b).
116
 *
117
 * When |mask| is all 1s or all 0s (as returned by the methods above),
118
 * the select methods return either |a| (if |mask| is nonzero) or |b|
119
 * (if |mask| is zero).
120
 */
121
static inline unsigned int constant_time_select(unsigned int mask,
122
                                                unsigned int a,
123
                                                unsigned int b);
124
/* Convenience method for unsigned chars. */
125
static inline unsigned char constant_time_select_8(unsigned char mask,
126
                                                   unsigned char a,
127
                                                   unsigned char b);
128
/* Convenience method for signed integers. */
129
static inline int constant_time_select_int(unsigned int mask, int a, int b);
130
131
static inline unsigned int constant_time_msb(unsigned int a)
132
{
133
    return 0 - (a >> (sizeof(a) * 8 - 1));
134
}
135
136
static inline unsigned int constant_time_lt(unsigned int a, unsigned int b)
137
{
138
    return constant_time_msb(a ^ ((a ^ b) | ((a - b) ^ b)));
139
}
140
141
static inline unsigned char constant_time_lt_8(unsigned int a, unsigned int b)
142
{
143
    return (unsigned char)(constant_time_lt(a, b));
144
}
145
146
static inline unsigned int constant_time_ge(unsigned int a, unsigned int b)
147
{
148
    return ~constant_time_lt(a, b);
149
}
150
151
static inline unsigned char constant_time_ge_8(unsigned int a, unsigned int b)
152
{
153
    return (unsigned char)(constant_time_ge(a, b));
154
}
155
156
static inline unsigned int constant_time_is_zero(unsigned int a)
157
{
158
    return constant_time_msb(~a & (a - 1));
159
}
160
161
static inline unsigned char constant_time_is_zero_8(unsigned int a)
162
{
163
    return (unsigned char)(constant_time_is_zero(a));
164
}
165
166
static inline unsigned int constant_time_eq(unsigned int a, unsigned int b)
167
{
168
    return constant_time_is_zero(a ^ b);
169
}
170
171
static inline unsigned char constant_time_eq_8(unsigned int a, unsigned int b)
172
{
173
    return (unsigned char)(constant_time_eq(a, b));
174
}
175
176
static inline unsigned int constant_time_eq_int(int a, int b)
177
{
178
    return constant_time_eq((unsigned)(a), (unsigned)(b));
179
}
180
181
static inline unsigned char constant_time_eq_int_8(int a, int b)
182
{
183
    return constant_time_eq_8((unsigned)(a), (unsigned)(b));
184
}
185
186
static inline unsigned int constant_time_select(unsigned int mask,
187
                                                unsigned int a,
188
                                                unsigned int b)
189
{
190
    return (mask & a) | (~mask & b);
191
}
192
193
static inline unsigned char constant_time_select_8(unsigned char mask,
194
                                                   unsigned char a,
195
                                                   unsigned char b)
196
{
197
    return (unsigned char)(constant_time_select(mask, a, b));
198
}
199
200
static inline int constant_time_select_int(unsigned int mask, int a, int b)
201
{
202
    return (int)(constant_time_select(mask, (unsigned)(a), (unsigned)(b)));
203
}
204
205
#ifdef __cplusplus
206
}
207
#endif
208
209
#endif                          /* HEADER_CONSTANT_TIME_LOCL_H */