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.
Dependents: MiniTLS-HTTPS-Example
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 Wed Jul 13 2022 00:22:54 by
1.7.2