Xuyi Wang / wolfSSL

Dependents:   OS

Committer:
wolfSSL
Date:
Fri Jun 26 00:39:20 2015 +0000
Revision:
0:d92f9d21154c
wolfSSL 3.6.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolfSSL 0:d92f9d21154c 1 /* misc.c
wolfSSL 0:d92f9d21154c 2 *
wolfSSL 0:d92f9d21154c 3 * Copyright (C) 2006-2015 wolfSSL Inc.
wolfSSL 0:d92f9d21154c 4 *
wolfSSL 0:d92f9d21154c 5 * This file is part of wolfSSL. (formerly known as CyaSSL)
wolfSSL 0:d92f9d21154c 6 *
wolfSSL 0:d92f9d21154c 7 * wolfSSL is free software; you can redistribute it and/or modify
wolfSSL 0:d92f9d21154c 8 * it under the terms of the GNU General Public License as published by
wolfSSL 0:d92f9d21154c 9 * the Free Software Foundation; either version 2 of the License, or
wolfSSL 0:d92f9d21154c 10 * (at your option) any later version.
wolfSSL 0:d92f9d21154c 11 *
wolfSSL 0:d92f9d21154c 12 * wolfSSL is distributed in the hope that it will be useful,
wolfSSL 0:d92f9d21154c 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
wolfSSL 0:d92f9d21154c 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
wolfSSL 0:d92f9d21154c 15 * GNU General Public License for more details.
wolfSSL 0:d92f9d21154c 16 *
wolfSSL 0:d92f9d21154c 17 * You should have received a copy of the GNU General Public License
wolfSSL 0:d92f9d21154c 18 * along with this program; if not, write to the Free Software
wolfSSL 0:d92f9d21154c 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
wolfSSL 0:d92f9d21154c 20 */
wolfSSL 0:d92f9d21154c 21
wolfSSL 0:d92f9d21154c 22 #ifdef HAVE_CONFIG_H
wolfSSL 0:d92f9d21154c 23 #include <config.h>
wolfSSL 0:d92f9d21154c 24 #endif
wolfSSL 0:d92f9d21154c 25
wolfSSL 0:d92f9d21154c 26 #include <wolfssl/wolfcrypt/settings.h>
wolfSSL 0:d92f9d21154c 27
wolfSSL 0:d92f9d21154c 28 #ifndef WOLF_CRYPT_MISC_C
wolfSSL 0:d92f9d21154c 29 #define WOLF_CRYPT_MISC_C
wolfSSL 0:d92f9d21154c 30
wolfSSL 0:d92f9d21154c 31 #include <wolfssl/wolfcrypt/misc.h>
wolfSSL 0:d92f9d21154c 32
wolfSSL 0:d92f9d21154c 33 /* inlining these functions is a huge speed increase and a small size decrease,
wolfSSL 0:d92f9d21154c 34 because the functions are smaller than function call setup/cleanup, e.g.,
wolfSSL 0:d92f9d21154c 35 md5 benchmark is twice as fast with inline. If you don't want it, then
wolfSSL 0:d92f9d21154c 36 define NO_INLINE and compile this file into wolfssl, otherwise it's used as
wolfSSL 0:d92f9d21154c 37 a source header
wolfSSL 0:d92f9d21154c 38 */
wolfSSL 0:d92f9d21154c 39
wolfSSL 0:d92f9d21154c 40 #ifdef NO_INLINE
wolfSSL 0:d92f9d21154c 41 #define STATIC
wolfSSL 0:d92f9d21154c 42 #else
wolfSSL 0:d92f9d21154c 43 #define STATIC static
wolfSSL 0:d92f9d21154c 44 #endif
wolfSSL 0:d92f9d21154c 45
wolfSSL 0:d92f9d21154c 46
wolfSSL 0:d92f9d21154c 47 #ifdef INTEL_INTRINSICS
wolfSSL 0:d92f9d21154c 48
wolfSSL 0:d92f9d21154c 49 #include <stdlib.h> /* get intrinsic definitions */
wolfSSL 0:d92f9d21154c 50
wolfSSL 0:d92f9d21154c 51 /* for non visual studio probably need no long version, 32 bit only
wolfSSL 0:d92f9d21154c 52 * i.e., _rotl and _rotr */
wolfSSL 0:d92f9d21154c 53 #pragma intrinsic(_lrotl, _lrotr)
wolfSSL 0:d92f9d21154c 54
wolfSSL 0:d92f9d21154c 55 STATIC INLINE word32 rotlFixed(word32 x, word32 y)
wolfSSL 0:d92f9d21154c 56 {
wolfSSL 0:d92f9d21154c 57 return y ? _lrotl(x, y) : x;
wolfSSL 0:d92f9d21154c 58 }
wolfSSL 0:d92f9d21154c 59
wolfSSL 0:d92f9d21154c 60 STATIC INLINE word32 rotrFixed(word32 x, word32 y)
wolfSSL 0:d92f9d21154c 61 {
wolfSSL 0:d92f9d21154c 62 return y ? _lrotr(x, y) : x;
wolfSSL 0:d92f9d21154c 63 }
wolfSSL 0:d92f9d21154c 64
wolfSSL 0:d92f9d21154c 65 #else /* generic */
wolfSSL 0:d92f9d21154c 66
wolfSSL 0:d92f9d21154c 67 STATIC INLINE word32 rotlFixed(word32 x, word32 y)
wolfSSL 0:d92f9d21154c 68 {
wolfSSL 0:d92f9d21154c 69 return (x << y) | (x >> (sizeof(y) * 8 - y));
wolfSSL 0:d92f9d21154c 70 }
wolfSSL 0:d92f9d21154c 71
wolfSSL 0:d92f9d21154c 72
wolfSSL 0:d92f9d21154c 73 STATIC INLINE word32 rotrFixed(word32 x, word32 y)
wolfSSL 0:d92f9d21154c 74 {
wolfSSL 0:d92f9d21154c 75 return (x >> y) | (x << (sizeof(y) * 8 - y));
wolfSSL 0:d92f9d21154c 76 }
wolfSSL 0:d92f9d21154c 77
wolfSSL 0:d92f9d21154c 78 #endif
wolfSSL 0:d92f9d21154c 79
wolfSSL 0:d92f9d21154c 80
wolfSSL 0:d92f9d21154c 81 STATIC INLINE word32 ByteReverseWord32(word32 value)
wolfSSL 0:d92f9d21154c 82 {
wolfSSL 0:d92f9d21154c 83 #ifdef PPC_INTRINSICS
wolfSSL 0:d92f9d21154c 84 /* PPC: load reverse indexed instruction */
wolfSSL 0:d92f9d21154c 85 return (word32)__lwbrx(&value,0);
wolfSSL 0:d92f9d21154c 86 #elif defined(KEIL_INTRINSICS)
wolfSSL 0:d92f9d21154c 87 return (word32)__rev(value);
wolfSSL 0:d92f9d21154c 88 #elif defined(FAST_ROTATE)
wolfSSL 0:d92f9d21154c 89 /* 5 instructions with rotate instruction, 9 without */
wolfSSL 0:d92f9d21154c 90 return (rotrFixed(value, 8U) & 0xff00ff00) |
wolfSSL 0:d92f9d21154c 91 (rotlFixed(value, 8U) & 0x00ff00ff);
wolfSSL 0:d92f9d21154c 92 #else
wolfSSL 0:d92f9d21154c 93 /* 6 instructions with rotate instruction, 8 without */
wolfSSL 0:d92f9d21154c 94 value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
wolfSSL 0:d92f9d21154c 95 return rotlFixed(value, 16U);
wolfSSL 0:d92f9d21154c 96 #endif
wolfSSL 0:d92f9d21154c 97 }
wolfSSL 0:d92f9d21154c 98
wolfSSL 0:d92f9d21154c 99
wolfSSL 0:d92f9d21154c 100 STATIC INLINE void ByteReverseWords(word32* out, const word32* in,
wolfSSL 0:d92f9d21154c 101 word32 byteCount)
wolfSSL 0:d92f9d21154c 102 {
wolfSSL 0:d92f9d21154c 103 word32 count = byteCount/(word32)sizeof(word32), i;
wolfSSL 0:d92f9d21154c 104
wolfSSL 0:d92f9d21154c 105 for (i = 0; i < count; i++)
wolfSSL 0:d92f9d21154c 106 out[i] = ByteReverseWord32(in[i]);
wolfSSL 0:d92f9d21154c 107
wolfSSL 0:d92f9d21154c 108 }
wolfSSL 0:d92f9d21154c 109
wolfSSL 0:d92f9d21154c 110
wolfSSL 0:d92f9d21154c 111 #ifdef WORD64_AVAILABLE
wolfSSL 0:d92f9d21154c 112
wolfSSL 0:d92f9d21154c 113
wolfSSL 0:d92f9d21154c 114 STATIC INLINE word64 rotlFixed64(word64 x, word64 y)
wolfSSL 0:d92f9d21154c 115 {
wolfSSL 0:d92f9d21154c 116 return (x << y) | (x >> (sizeof(y) * 8 - y));
wolfSSL 0:d92f9d21154c 117 }
wolfSSL 0:d92f9d21154c 118
wolfSSL 0:d92f9d21154c 119
wolfSSL 0:d92f9d21154c 120 STATIC INLINE word64 rotrFixed64(word64 x, word64 y)
wolfSSL 0:d92f9d21154c 121 {
wolfSSL 0:d92f9d21154c 122 return (x >> y) | (x << (sizeof(y) * 8 - y));
wolfSSL 0:d92f9d21154c 123 }
wolfSSL 0:d92f9d21154c 124
wolfSSL 0:d92f9d21154c 125
wolfSSL 0:d92f9d21154c 126 STATIC INLINE word64 ByteReverseWord64(word64 value)
wolfSSL 0:d92f9d21154c 127 {
wolfSSL 0:d92f9d21154c 128 #ifdef WOLFCRYPT_SLOW_WORD64
wolfSSL 0:d92f9d21154c 129 return (word64)(ByteReverseWord32((word32)value)) << 32 |
wolfSSL 0:d92f9d21154c 130 ByteReverseWord32((word32)(value>>32));
wolfSSL 0:d92f9d21154c 131 #else
wolfSSL 0:d92f9d21154c 132 value = ((value & W64LIT(0xFF00FF00FF00FF00)) >> 8) |
wolfSSL 0:d92f9d21154c 133 ((value & W64LIT(0x00FF00FF00FF00FF)) << 8);
wolfSSL 0:d92f9d21154c 134 value = ((value & W64LIT(0xFFFF0000FFFF0000)) >> 16) |
wolfSSL 0:d92f9d21154c 135 ((value & W64LIT(0x0000FFFF0000FFFF)) << 16);
wolfSSL 0:d92f9d21154c 136 return rotlFixed64(value, 32U);
wolfSSL 0:d92f9d21154c 137 #endif
wolfSSL 0:d92f9d21154c 138 }
wolfSSL 0:d92f9d21154c 139
wolfSSL 0:d92f9d21154c 140
wolfSSL 0:d92f9d21154c 141 STATIC INLINE void ByteReverseWords64(word64* out, const word64* in,
wolfSSL 0:d92f9d21154c 142 word32 byteCount)
wolfSSL 0:d92f9d21154c 143 {
wolfSSL 0:d92f9d21154c 144 word32 count = byteCount/(word32)sizeof(word64), i;
wolfSSL 0:d92f9d21154c 145
wolfSSL 0:d92f9d21154c 146 for (i = 0; i < count; i++)
wolfSSL 0:d92f9d21154c 147 out[i] = ByteReverseWord64(in[i]);
wolfSSL 0:d92f9d21154c 148
wolfSSL 0:d92f9d21154c 149 }
wolfSSL 0:d92f9d21154c 150
wolfSSL 0:d92f9d21154c 151 #endif /* WORD64_AVAILABLE */
wolfSSL 0:d92f9d21154c 152
wolfSSL 0:d92f9d21154c 153
wolfSSL 0:d92f9d21154c 154 STATIC INLINE void XorWords(wolfssl_word* r, const wolfssl_word* a, word32 n)
wolfSSL 0:d92f9d21154c 155 {
wolfSSL 0:d92f9d21154c 156 word32 i;
wolfSSL 0:d92f9d21154c 157
wolfSSL 0:d92f9d21154c 158 for (i = 0; i < n; i++) r[i] ^= a[i];
wolfSSL 0:d92f9d21154c 159 }
wolfSSL 0:d92f9d21154c 160
wolfSSL 0:d92f9d21154c 161
wolfSSL 0:d92f9d21154c 162 STATIC INLINE void xorbuf(void* buf, const void* mask, word32 count)
wolfSSL 0:d92f9d21154c 163 {
wolfSSL 0:d92f9d21154c 164 if (((wolfssl_word)buf | (wolfssl_word)mask | count) % WOLFSSL_WORD_SIZE == 0)
wolfSSL 0:d92f9d21154c 165 XorWords( (wolfssl_word*)buf,
wolfSSL 0:d92f9d21154c 166 (const wolfssl_word*)mask, count / WOLFSSL_WORD_SIZE);
wolfSSL 0:d92f9d21154c 167 else {
wolfSSL 0:d92f9d21154c 168 word32 i;
wolfSSL 0:d92f9d21154c 169 byte* b = (byte*)buf;
wolfSSL 0:d92f9d21154c 170 const byte* m = (const byte*)mask;
wolfSSL 0:d92f9d21154c 171
wolfSSL 0:d92f9d21154c 172 for (i = 0; i < count; i++) b[i] ^= m[i];
wolfSSL 0:d92f9d21154c 173 }
wolfSSL 0:d92f9d21154c 174 }
wolfSSL 0:d92f9d21154c 175
wolfSSL 0:d92f9d21154c 176
wolfSSL 0:d92f9d21154c 177 /* Make sure compiler doesn't skip */
wolfSSL 0:d92f9d21154c 178 STATIC INLINE void ForceZero(const void* mem, word32 len)
wolfSSL 0:d92f9d21154c 179 {
wolfSSL 0:d92f9d21154c 180 volatile byte* z = (volatile byte*)mem;
wolfSSL 0:d92f9d21154c 181
wolfSSL 0:d92f9d21154c 182 while (len--) *z++ = 0;
wolfSSL 0:d92f9d21154c 183 }
wolfSSL 0:d92f9d21154c 184
wolfSSL 0:d92f9d21154c 185
wolfSSL 0:d92f9d21154c 186 /* check all length bytes for equality, return 0 on success */
wolfSSL 0:d92f9d21154c 187 STATIC INLINE int ConstantCompare(const byte* a, const byte* b, int length)
wolfSSL 0:d92f9d21154c 188 {
wolfSSL 0:d92f9d21154c 189 int i;
wolfSSL 0:d92f9d21154c 190 int compareSum = 0;
wolfSSL 0:d92f9d21154c 191
wolfSSL 0:d92f9d21154c 192 for (i = 0; i < length; i++) {
wolfSSL 0:d92f9d21154c 193 compareSum |= a[i] ^ b[i];
wolfSSL 0:d92f9d21154c 194 }
wolfSSL 0:d92f9d21154c 195
wolfSSL 0:d92f9d21154c 196 return compareSum;
wolfSSL 0:d92f9d21154c 197 }
wolfSSL 0:d92f9d21154c 198
wolfSSL 0:d92f9d21154c 199 #undef STATIC
wolfSSL 0:d92f9d21154c 200
wolfSSL 0:d92f9d21154c 201 #endif /* WOLF_CRYPT_MISC_C */
wolfSSL 0:d92f9d21154c 202