Port of TI's CC3100 Websock camera demo. Using FreeRTOS, mbedTLS, also parts of Arducam for cams ov5642 and 0v2640. Can also use MT9D111. Work in progress. Be warned some parts maybe a bit flacky. This is for Seeed Arch max only, for an M3, see the demo for CM3 using the 0v5642 aducam mini.
md.h
00001 /** 00002 * \file md.h 00003 * 00004 * \brief Generic message digest wrapper 00005 * 00006 * \author Adriaan de Jong <dejong@fox-it.com> 00007 * 00008 * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved 00009 * 00010 * This file is part of mbed TLS (https://tls.mbed.org) 00011 * 00012 * This program is free software; you can redistribute it and/or modify 00013 * it under the terms of the GNU General Public License as published by 00014 * the Free Software Foundation; either version 2 of the License, or 00015 * (at your option) any later version. 00016 * 00017 * This program is distributed in the hope that it will be useful, 00018 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00019 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00020 * GNU General Public License for more details. 00021 * 00022 * You should have received a copy of the GNU General Public License along 00023 * with this program; if not, write to the Free Software Foundation, Inc., 00024 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 00025 */ 00026 #ifndef POLARSSL_MD_H 00027 #define POLARSSL_MD_H 00028 00029 #include <stddef.h> 00030 00031 #if defined(_MSC_VER) && !defined(inline) 00032 #define inline _inline 00033 #else 00034 #if defined(__ARMCC_VERSION) && !defined(inline) 00035 #define inline __inline 00036 #endif /* __ARMCC_VERSION */ 00037 #endif /*_MSC_VER */ 00038 00039 #define POLARSSL_ERR_MD_FEATURE_UNAVAILABLE -0x5080 /**< The selected feature is not available. */ 00040 #define POLARSSL_ERR_MD_BAD_INPUT_DATA -0x5100 /**< Bad input parameters to function. */ 00041 #define POLARSSL_ERR_MD_ALLOC_FAILED -0x5180 /**< Failed to allocate memory. */ 00042 #define POLARSSL_ERR_MD_FILE_IO_ERROR -0x5200 /**< Opening or reading of file failed. */ 00043 00044 #ifdef __cplusplus 00045 extern "C" { 00046 #endif 00047 00048 typedef enum { 00049 POLARSSL_MD_NONE=0, 00050 POLARSSL_MD_MD2, 00051 POLARSSL_MD_MD4, 00052 POLARSSL_MD_MD5, 00053 POLARSSL_MD_SHA1, 00054 POLARSSL_MD_SHA224, 00055 POLARSSL_MD_SHA256, 00056 POLARSSL_MD_SHA384, 00057 POLARSSL_MD_SHA512, 00058 POLARSSL_MD_RIPEMD160, 00059 } md_type_t; 00060 00061 #if defined(POLARSSL_SHA512_C) 00062 #define POLARSSL_MD_MAX_SIZE 64 /* longest known is SHA512 */ 00063 #else 00064 #define POLARSSL_MD_MAX_SIZE 32 /* longest known is SHA256 or less */ 00065 #endif 00066 00067 /** 00068 * Message digest information. Allows message digest functions to be called 00069 * in a generic way. 00070 */ 00071 typedef struct { 00072 /** Digest identifier */ 00073 md_type_t type; 00074 00075 /** Name of the message digest */ 00076 const char * name; 00077 00078 /** Output length of the digest function */ 00079 int size; 00080 00081 /** Digest initialisation function */ 00082 void (*starts_func)( void *ctx ); 00083 00084 /** Digest update function */ 00085 void (*update_func)( void *ctx, const unsigned char *input, size_t ilen ); 00086 00087 /** Digest finalisation function */ 00088 void (*finish_func)( void *ctx, unsigned char *output ); 00089 00090 /** Generic digest function */ 00091 void (*digest_func)( const unsigned char *input, size_t ilen, 00092 unsigned char *output ); 00093 00094 /** Generic file digest function */ 00095 int (*file_func)( const char *path, unsigned char *output ); 00096 00097 /** HMAC Initialisation function */ 00098 void (*hmac_starts_func)( void *ctx, const unsigned char *key, 00099 size_t keylen ); 00100 00101 /** HMAC update function */ 00102 void (*hmac_update_func)( void *ctx, const unsigned char *input, 00103 size_t ilen ); 00104 00105 /** HMAC finalisation function */ 00106 void (*hmac_finish_func)( void *ctx, unsigned char *output); 00107 00108 /** HMAC context reset function */ 00109 void (*hmac_reset_func)( void *ctx ); 00110 00111 /** Generic HMAC function */ 00112 void (*hmac_func)( const unsigned char *key, size_t keylen, 00113 const unsigned char *input, size_t ilen, 00114 unsigned char *output ); 00115 00116 /** Allocate a new context */ 00117 void * (*ctx_alloc_func)( void ); 00118 00119 /** Free the given context */ 00120 void (*ctx_free_func)( void *ctx ); 00121 00122 /** Internal use only */ 00123 void (*process_func)( void *ctx, const unsigned char *input ); 00124 } md_info_t; 00125 00126 /** 00127 * Generic message digest context. 00128 */ 00129 typedef struct { 00130 /** Information about the associated message digest */ 00131 const md_info_t *md_info; 00132 00133 /** Digest-specific context */ 00134 void *md_ctx; 00135 } md_context_t; 00136 00137 #define MD_CONTEXT_T_INIT { \ 00138 NULL, /* md_info */ \ 00139 NULL, /* md_ctx */ \ 00140 } 00141 00142 /** 00143 * \brief Returns the list of digests supported by the generic digest module. 00144 * 00145 * \return a statically allocated array of digests, the last entry 00146 * is 0. 00147 */ 00148 const int *md_list( void ); 00149 00150 /** 00151 * \brief Returns the message digest information associated with the 00152 * given digest name. 00153 * 00154 * \param md_name Name of the digest to search for. 00155 * 00156 * \return The message digest information associated with md_name or 00157 * NULL if not found. 00158 */ 00159 const md_info_t *md_info_from_string( const char *md_name ); 00160 00161 /** 00162 * \brief Returns the message digest information associated with the 00163 * given digest type. 00164 * 00165 * \param md_type type of digest to search for. 00166 * 00167 * \return The message digest information associated with md_type or 00168 * NULL if not found. 00169 */ 00170 const md_info_t *md_info_from_type( md_type_t md_type ); 00171 00172 /** 00173 * \brief Initialize a md_context (as NONE) 00174 */ 00175 void md_init( md_context_t *ctx ); 00176 00177 /** 00178 * \brief Free and clear the message-specific context of ctx. 00179 * Freeing ctx itself remains the responsibility of the 00180 * caller. 00181 */ 00182 void md_free( md_context_t *ctx ); 00183 00184 /** 00185 * \brief Initialises and fills the message digest context structure 00186 * with the appropriate values. 00187 * 00188 * \note Currently also clears structure. In future versions you 00189 * will be required to call md_init() on the structure 00190 * first. 00191 * 00192 * \param ctx context to initialise. May not be NULL. The 00193 * digest-specific context (ctx->md_ctx) must be NULL. It will 00194 * be allocated, and must be freed using md_free_ctx() later. 00195 * \param md_info message digest to use. 00196 * 00197 * \returns \c 0 on success, \c POLARSSL_ERR_MD_BAD_INPUT_DATA on 00198 * parameter failure, \c POLARSSL_ERR_MD_ALLOC_FAILED if 00199 * allocation of the digest-specific context failed. 00200 */ 00201 int md_init_ctx( md_context_t *ctx, const md_info_t *md_info ); 00202 00203 #if ! defined(POLARSSL_DEPRECATED_REMOVED) 00204 #if defined(POLARSSL_DEPRECATED_WARNING) 00205 #define DEPRECATED __attribute__((deprecated)) 00206 #else 00207 #define DEPRECATED 00208 #endif 00209 /** 00210 * \brief Free the message-specific context of ctx. Freeing ctx itself 00211 * remains the responsibility of the caller. 00212 * 00213 * \deprecated Use md_free() instead 00214 * 00215 * \param ctx Free the message-specific context 00216 * 00217 * \returns 0 00218 */ 00219 int md_free_ctx( md_context_t *ctx ) DEPRECATED; 00220 #undef DEPRECATED 00221 #endif /* POLARSSL_DEPRECATED_REMOVED */ 00222 00223 /** 00224 * \brief Returns the size of the message digest output. 00225 * 00226 * \param md_info message digest info 00227 * 00228 * \return size of the message digest output. 00229 */ 00230 static inline unsigned char md_get_size( const md_info_t *md_info ) 00231 { 00232 if( md_info == NULL ) 00233 return( 0 ); 00234 00235 return md_info->size; 00236 } 00237 00238 /** 00239 * \brief Returns the type of the message digest output. 00240 * 00241 * \param md_info message digest info 00242 * 00243 * \return type of the message digest output. 00244 */ 00245 static inline md_type_t md_get_type( const md_info_t *md_info ) 00246 { 00247 if( md_info == NULL ) 00248 return( POLARSSL_MD_NONE ); 00249 00250 return md_info->type; 00251 } 00252 00253 /** 00254 * \brief Returns the name of the message digest output. 00255 * 00256 * \param md_info message digest info 00257 * 00258 * \return name of the message digest output. 00259 */ 00260 static inline const char *md_get_name( const md_info_t *md_info ) 00261 { 00262 if( md_info == NULL ) 00263 return( NULL ); 00264 00265 return md_info->name; 00266 } 00267 00268 /** 00269 * \brief Set-up the given context for a new message digest 00270 * 00271 * \param ctx generic message digest context. 00272 * 00273 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter 00274 * verification fails. 00275 */ 00276 int md_starts( md_context_t *ctx ); 00277 00278 /** 00279 * \brief Generic message digest process buffer 00280 * 00281 * \param ctx Generic message digest context 00282 * \param input buffer holding the datal 00283 * \param ilen length of the input data 00284 * 00285 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter 00286 * verification fails. 00287 */ 00288 int md_update( md_context_t *ctx, const unsigned char *input, size_t ilen ); 00289 00290 /** 00291 * \brief Generic message digest final digest 00292 * 00293 * \param ctx Generic message digest context 00294 * \param output Generic message digest checksum result 00295 * 00296 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter 00297 * verification fails. 00298 */ 00299 int md_finish( md_context_t *ctx, unsigned char *output ); 00300 00301 /** 00302 * \brief Output = message_digest( input buffer ) 00303 * 00304 * \param md_info message digest info 00305 * \param input buffer holding the data 00306 * \param ilen length of the input data 00307 * \param output Generic message digest checksum result 00308 * 00309 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter 00310 * verification fails. 00311 */ 00312 int md( const md_info_t *md_info, const unsigned char *input, size_t ilen, 00313 unsigned char *output ); 00314 00315 /** 00316 * \brief Output = message_digest( file contents ) 00317 * 00318 * \param md_info message digest info 00319 * \param path input file name 00320 * \param output generic message digest checksum result 00321 * 00322 * \return 0 if successful, POLARSSL_ERR_MD_FILE_OPEN_FAILED if fopen 00323 * failed, POLARSSL_ERR_MD_FILE_READ_FAILED if fread failed, 00324 * POLARSSL_ERR_MD_BAD_INPUT_DATA if md_info was NULL. 00325 */ 00326 int md_file( const md_info_t *md_info, const char *path, 00327 unsigned char *output ); 00328 00329 /** 00330 * \brief Generic HMAC context setup 00331 * 00332 * \param ctx HMAC context to be initialized 00333 * \param key HMAC secret key 00334 * \param keylen length of the HMAC key 00335 * 00336 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter 00337 * verification fails. 00338 */ 00339 int md_hmac_starts( md_context_t *ctx, const unsigned char *key, 00340 size_t keylen ); 00341 00342 /** 00343 * \brief Generic HMAC process buffer 00344 * 00345 * \param ctx HMAC context 00346 * \param input buffer holding the data 00347 * \param ilen length of the input data 00348 * 00349 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter 00350 * verification fails. 00351 */ 00352 int md_hmac_update( md_context_t *ctx, const unsigned char *input, 00353 size_t ilen ); 00354 00355 /** 00356 * \brief Generic HMAC final digest 00357 * 00358 * \param ctx HMAC context 00359 * \param output Generic HMAC checksum result 00360 * 00361 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter 00362 * verification fails. 00363 */ 00364 int md_hmac_finish( md_context_t *ctx, unsigned char *output); 00365 00366 /** 00367 * \brief Generic HMAC context reset 00368 * 00369 * \param ctx HMAC context to be reset 00370 * 00371 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter 00372 * verification fails. 00373 */ 00374 int md_hmac_reset( md_context_t *ctx ); 00375 00376 /** 00377 * \brief Output = Generic_HMAC( hmac key, input buffer ) 00378 * 00379 * \param md_info message digest info 00380 * \param key HMAC secret key 00381 * \param keylen length of the HMAC key 00382 * \param input buffer holding the data 00383 * \param ilen length of the input data 00384 * \param output Generic HMAC-result 00385 * 00386 * \returns 0 on success, POLARSSL_ERR_MD_BAD_INPUT_DATA if parameter 00387 * verification fails. 00388 */ 00389 int md_hmac( const md_info_t *md_info, const unsigned char *key, size_t keylen, 00390 const unsigned char *input, size_t ilen, 00391 unsigned char *output ); 00392 00393 /* Internal use */ 00394 int md_process( md_context_t *ctx, const unsigned char *data ); 00395 00396 #ifdef __cplusplus 00397 } 00398 #endif 00399 00400 #endif /* POLARSSL_MD_H */ 00401
Generated on Tue Jul 12 2022 22:22:38 by 1.7.2