ARM Shanghai IoT Team (Internal) / newMiniTLS-GPL

Fork of MiniTLS-GPL by Donatien Garnier

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers crypto_macros.h Source File

crypto_macros.h

Go to the documentation of this file.
00001 /*
00002 MiniTLS - A super trimmed down TLS/SSL Library for embedded devices
00003 Author: Donatien Garnier
00004 Copyright (C) 2013-2014 AppNearMe Ltd
00005 
00006 This program is free software; you can redistribute it and/or
00007 modify it under the terms of the GNU General Public License
00008 as published by the Free Software Foundation; either version 2
00009 of the License, or (at your option) any later version.
00010 
00011 This program is distributed in the hope that it will be useful,
00012 but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 GNU General Public License for more details.
00015 
00016 You should have received a copy of the GNU General Public License
00017 along with this program; if not, write to the Free Software
00018 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00019 *//**
00020  * \file crypto_macros.h
00021  * \copyright Copyright (c) AppNearMe Ltd 2013
00022  * \author Donatien Garnier
00023  */
00024 
00025 #ifndef CRYPTO_MACROS_H_
00026 #define CRYPTO_MACROS_H_
00027 
00028 #ifdef __cplusplus
00029 extern "C" {
00030 #endif
00031 
00032 #include "core/fwk.h"
00033 #include "inc/minitls_config.h"
00034 
00035 #define XMEMCPY memcpy
00036 
00037 #define CONST64(n) n ## ULL
00038 typedef uint64_t ulong64;
00039 typedef uint32_t ulong32;
00040 
00041 /* ---- HELPER MACROS ---- */
00042 #ifdef ENDIAN_NEUTRAL
00043 
00044 #define STORE32L(x, y)                                                                     \
00045      { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);   \
00046        (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
00047 
00048 #define LOAD32L(x, y)                            \
00049      { x = ((unsigned long)((y)[3] & 255)<<24) | \
00050            ((unsigned long)((y)[2] & 255)<<16) | \
00051            ((unsigned long)((y)[1] & 255)<<8)  | \
00052            ((unsigned long)((y)[0] & 255)); }
00053 
00054 #define STORE64L(x, y)                                                                     \
00055      { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255);   \
00056        (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255);   \
00057        (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);   \
00058        (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
00059 
00060 #define LOAD64L(x, y)                                                       \
00061      { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
00062            (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
00063            (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
00064            (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
00065 
00066 #define STORE32H(x, y)                                                                     \
00067      { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255);   \
00068        (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
00069 
00070 #define LOAD32H(x, y)                            \
00071      { x = ((unsigned long)((y)[0] & 255)<<24) | \
00072            ((unsigned long)((y)[1] & 255)<<16) | \
00073            ((unsigned long)((y)[2] & 255)<<8)  | \
00074            ((unsigned long)((y)[3] & 255)); }
00075 
00076 #define STORE64H(x, y)                                                                     \
00077    { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255);     \
00078      (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255);     \
00079      (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255);     \
00080      (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
00081 
00082 #define LOAD64H(x, y)                                                      \
00083    { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
00084          (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
00085          (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
00086          (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
00087 
00088 #endif /* ENDIAN_NEUTRAL */
00089 
00090 #ifdef ENDIAN_LITTLE
00091 
00092 #define STORE32H(x, y)                                                                     \
00093      { (y)[0] = (unsigned char)(((x)>>24)&255); (y)[1] = (unsigned char)(((x)>>16)&255);   \
00094        (y)[2] = (unsigned char)(((x)>>8)&255); (y)[3] = (unsigned char)((x)&255); }
00095 
00096 #define LOAD32H(x, y)                            \
00097      { x = ((unsigned long)((y)[0] & 255)<<24) | \
00098            ((unsigned long)((y)[1] & 255)<<16) | \
00099            ((unsigned long)((y)[2] & 255)<<8)  | \
00100            ((unsigned long)((y)[3] & 255)); }
00101 
00102 #define STORE64H(x, y)                                                                     \
00103    { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255);     \
00104      (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255);     \
00105      (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255);     \
00106      (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); }
00107 
00108 #define LOAD64H(x, y)                                                      \
00109    { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48) | \
00110          (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32) | \
00111          (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16) | \
00112          (((ulong64)((y)[6] & 255))<<8)|(((ulong64)((y)[7] & 255))); }
00113 
00114 
00115 #ifdef ENDIAN_32BITWORD
00116 
00117 #define STORE32L(x, y)        \
00118      { ulong32  __t = (x); XMEMCPY(y, &__t, 4); }
00119 
00120 #define LOAD32L(x, y)         \
00121      XMEMCPY(&(x), y, 4);
00122 
00123 #define STORE64L(x, y)                                                                     \
00124      { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255);   \
00125        (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255);   \
00126        (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);   \
00127        (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
00128 
00129 #define LOAD64L(x, y)                                                       \
00130      { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48)| \
00131            (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32)| \
00132            (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16)| \
00133            (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
00134 
00135 #else /* 64-bit words then  */
00136 
00137 #define STORE32L(x, y)        \
00138      { ulong32 __t = (x); XMEMCPY(y, &__t, 4); }
00139 
00140 #define LOAD32L(x, y)         \
00141      { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; }
00142 
00143 #define STORE64L(x, y)        \
00144      { ulong64 __t = (x); XMEMCPY(y, &__t, 8); }
00145 
00146 #define LOAD64L(x, y)         \
00147     { XMEMCPY(&(x), y, 8); }
00148 
00149 #endif /* ENDIAN_64BITWORD */
00150 
00151 #endif /* ENDIAN_LITTLE */
00152 
00153 #ifdef ENDIAN_BIG
00154 #define STORE32L(x, y)                                                                     \
00155      { (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);   \
00156        (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
00157 
00158 #define LOAD32L(x, y)                            \
00159      { x = ((unsigned long)((y)[3] & 255)<<24) | \
00160            ((unsigned long)((y)[2] & 255)<<16) | \
00161            ((unsigned long)((y)[1] & 255)<<8)  | \
00162            ((unsigned long)((y)[0] & 255)); }
00163 
00164 #define STORE64L(x, y)                                                                     \
00165    { (y)[7] = (unsigned char)(((x)>>56)&255); (y)[6] = (unsigned char)(((x)>>48)&255);     \
00166      (y)[5] = (unsigned char)(((x)>>40)&255); (y)[4] = (unsigned char)(((x)>>32)&255);     \
00167      (y)[3] = (unsigned char)(((x)>>24)&255); (y)[2] = (unsigned char)(((x)>>16)&255);     \
00168      (y)[1] = (unsigned char)(((x)>>8)&255); (y)[0] = (unsigned char)((x)&255); }
00169 
00170 #define LOAD64L(x, y)                                                      \
00171    { x = (((ulong64)((y)[7] & 255))<<56)|(((ulong64)((y)[6] & 255))<<48) | \
00172          (((ulong64)((y)[5] & 255))<<40)|(((ulong64)((y)[4] & 255))<<32) | \
00173          (((ulong64)((y)[3] & 255))<<24)|(((ulong64)((y)[2] & 255))<<16) | \
00174          (((ulong64)((y)[1] & 255))<<8)|(((ulong64)((y)[0] & 255))); }
00175 
00176 #ifdef ENDIAN_32BITWORD
00177 
00178 #define STORE32H(x, y)        \
00179      { ulong32 __t = (x); XMEMCPY(y, &__t, 4); }
00180 
00181 #define LOAD32H(x, y)         \
00182      XMEMCPY(&(x), y, 4);
00183 
00184 #define STORE64H(x, y)                                                                     \
00185      { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255);   \
00186        (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255);   \
00187        (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255);   \
00188        (y)[6] = (unsigned char)(((x)>>8)&255);  (y)[7] = (unsigned char)((x)&255); }
00189 
00190 #define LOAD64H(x, y)                                                       \
00191      { x = (((ulong64)((y)[0] & 255))<<56)|(((ulong64)((y)[1] & 255))<<48)| \
00192            (((ulong64)((y)[2] & 255))<<40)|(((ulong64)((y)[3] & 255))<<32)| \
00193            (((ulong64)((y)[4] & 255))<<24)|(((ulong64)((y)[5] & 255))<<16)| \
00194            (((ulong64)((y)[6] & 255))<<8)| (((ulong64)((y)[7] & 255))); }
00195 
00196 #else /* 64-bit words then  */
00197 
00198 #define STORE32H(x, y)        \
00199      { ulong32 __t = (x); XMEMCPY(y, &__t, 4); }
00200 
00201 #define LOAD32H(x, y)         \
00202      { XMEMCPY(&(x), y, 4); x &= 0xFFFFFFFF; }
00203 
00204 #define STORE64H(x, y)        \
00205      { ulong64 __t = (x); XMEMCPY(y, &__t, 8); }
00206 
00207 #define LOAD64H(x, y)         \
00208     { XMEMCPY(&(x), y, 8); }
00209 
00210 #endif /* ENDIAN_64BITWORD */
00211 #endif /* ENDIAN_BIG */
00212 
00213 #define BSWAP(x)  ( ((x>>24)&0x000000FFUL) | ((x<<24)&0xFF000000UL)  | \
00214                     ((x>>8)&0x0000FF00UL)  | ((x<<8)&0x00FF0000UL) )
00215 
00216 
00217 /* 32-bit Rotates */
00218 //#define ROLc ROL
00219 //#define RORc ROR
00220 
00221 /* rotates the hard way */
00222 #define ROL(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
00223 #define ROR(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
00224 #define ROLc(x, y) ( (((unsigned long)(x)<<(unsigned long)((y)&31)) | (((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
00225 #define RORc(x, y) ( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | ((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)
00226 
00227 //#define ROL64c ROL64
00228 //#define ROR64c ROR64
00229 
00230 #define ROL64(x, y) \
00231     ( (((x)<<((ulong64)(y)&63)) | \
00232       (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
00233 
00234 #define ROR64(x, y) \
00235     ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
00236       ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
00237 
00238 #define ROL64c(x, y) \
00239     ( (((x)<<((ulong64)(y)&63)) | \
00240       (((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)64-((y)&63)))) & CONST64(0xFFFFFFFFFFFFFFFF))
00241 
00242 #define ROR64c(x, y) \
00243     ( ((((x)&CONST64(0xFFFFFFFFFFFFFFFF))>>((ulong64)(y)&CONST64(63))) | \
00244       ((x)<<((ulong64)(64-((y)&CONST64(63)))))) & CONST64(0xFFFFFFFFFFFFFFFF))
00245 
00246 #ifndef MAX
00247    #define MAX(x, y) ( ((x)>(y))?(x):(y) )
00248 #endif
00249 
00250 #ifndef MIN
00251    #define MIN(x, y) ( ((x)<(y))?(x):(y) )
00252 #endif
00253 
00254 /* extract a byte portably */
00255 #define byte(x, n) (((x) >> (8 * (n))) & 255)
00256 
00257 #ifdef __cplusplus
00258 }
00259 #endif
00260 
00261 #endif /* CRYPTO_MACROS_H_ */