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