Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MiniTLS-GPL by
crypto_macros.h
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_ */
Generated on Tue Jul 12 2022 19:20:10 by
1.7.2
