3 * Copyright (C) 2006-2015 wolfSSL Inc.
5 * This file is part of wolfSSL. (formerly known as CyaSSL)
7 * wolfSSL is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * wolfSSL is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
27 #include <wolfssl/wolfcrypt/settings.h>
29 #include <wolfssl/wolfcrypt/types.h>
31 #if defined(WOLFSSL_TI_HASH)
40 #include <wolfssl/wolfcrypt/error-crypt.h>
41 #include <wolfssl/wolfcrypt/md5.h>
42 #include <wolfssl/wolfcrypt/sha.h>
43 #include <wolfssl/wolfcrypt/sha256.h>
44 #include <wolfssl/wolfcrypt/port/ti/ti-hash.h>
45 #include <wolfssl/wolfcrypt/port/ti/ti-ccm.h>
46 #include <wolfssl/wolfcrypt/logging.h>
48 #ifndef TI_DUMMY_BUILD
49 #include "inc/hw_memmap.h"
50 #include "inc/hw_shamd5.h"
51 #include "inc/hw_ints.h"
52 #include "driverlib/shamd5.h"
53 #include "driverlib/sysctl.h"
54 #include "driverlib/rom_map.h"
55 #include "driverlib/rom.h"
57 #define SHAMD5_ALGO_MD5 1
58 #define SHAMD5_ALGO_SHA1 2
59 #define SHAMD5_ALGO_SHA256 3
60 bool wolfSSL_TI_CCMInit(void) { return true ; }
63 static int hashInit(wolfssl_TI_Hash *hash) {
70 static int hashUpdate(wolfssl_TI_Hash *hash, const byte* data, word32 len)
74 if((hash== NULL) || (data == NULL))return BAD_FUNC_ARG;
76 if(hash->len < hash->used+len) {
77 if(hash->msg == NULL) {
78 p = XMALLOC(hash->used+len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
80 p = XREALLOC(hash->msg, hash->used+len, NULL, DYNAMIC_TYPE_TMP_BUFFER);
84 hash->len = hash->used+len ;
86 XMEMCPY(hash->msg+hash->used, data, len) ;
91 static int hashGetHash(wolfssl_TI_Hash *hash, byte* result, word32 algo, word32 hsize)
94 #ifndef TI_DUMMY_BUILD
95 wolfSSL_TI_lockCCM() ;
96 ROM_SHAMD5Reset(SHAMD5_BASE);
97 ROM_SHAMD5ConfigSet(SHAMD5_BASE, algo);
98 ROM_SHAMD5DataProcess(SHAMD5_BASE,
99 (uint32_t *)hash->msg, hash->used, h);
100 wolfSSL_TI_unlockCCM() ;
105 XMEMCPY(result, h, hsize) ;
110 static void hashRestorePos(wolfssl_TI_Hash *h1, wolfssl_TI_Hash *h2) {
111 h1->used = h2->used ;
114 static int hashFinal(wolfssl_TI_Hash *hash, byte* result, word32 algo, word32 hsize)
116 hashGetHash(hash, result, algo, hsize) ;
117 XFREE(hash->msg, NULL, DYNAMIC_TYPE_TMP_BUFFER);
122 static int hashHash(const byte* data, word32 len, byte* hash, word32 algo, word32 hsize)
125 #ifdef WOLFSSL_SMALL_STACK
126 wolfssl_TI_Hash* hash_desc;
128 wolfssl_TI_Hash hash_desc[1];
131 #ifdef WOLFSSL_SMALL_STACK
132 hash_desc = (wolfssl_TI_Hash*)XMALLOC(sizeof(wolfssl_TI_Hash), NULL, DYNAMIC_TYPE_TMP_BUFFER);
133 if (hash_desc == NULL)
137 if ((ret = hashInit(hash_desc)) != 0) {
138 WOLFSSL_MSG("Hash Init failed");
141 hashUpdate(hash_desc, data, len);
142 hashFinal(hash_desc, hash, algo, hsize);
145 #ifdef WOLFSSL_SMALL_STACK
146 XFREE(hash, NULL, DYNAMIC_TYPE_TMP_BUFFER);
153 WOLFSSL_API void wc_InitMd5(Md5* md5)
157 if(!wolfSSL_TI_CCMInit())return ;
158 hashInit((wolfssl_TI_Hash *)md5) ;
161 WOLFSSL_API void wc_Md5Update(Md5* md5, const byte* data, word32 len)
163 hashUpdate((wolfssl_TI_Hash *)md5, data, len) ;
166 WOLFSSL_API void wc_Md5Final(Md5* md5, byte* hash)
168 hashFinal((wolfssl_TI_Hash *)md5, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ;
171 WOLFSSL_API void wc_Md5GetHash(Md5* md5, byte* hash)
173 hashGetHash((wolfssl_TI_Hash *)md5, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ;
176 WOLFSSL_API void wc_Md5RestorePos(Md5* m1, Md5* m2) {
177 hashRestorePos((wolfssl_TI_Hash *)m1, (wolfssl_TI_Hash *)m2) ;
180 WOLFSSL_API int wc_Md5Hash(const byte*data, word32 len, byte*hash)
182 return hashHash(data, len, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE) ;
188 WOLFSSL_API int wc_InitSha(Sha* sha)
192 if(!wolfSSL_TI_CCMInit())return 1 ;
193 return hashInit((wolfssl_TI_Hash *)sha) ;
196 WOLFSSL_API int wc_ShaUpdate(Sha* sha, const byte* data, word32 len)
198 return hashUpdate((wolfssl_TI_Hash *)sha, data, len) ;
201 WOLFSSL_API int wc_ShaFinal(Sha* sha, byte* hash)
203 return hashFinal((wolfssl_TI_Hash *)sha, hash, SHAMD5_ALGO_SHA1, SHA_DIGEST_SIZE) ;
206 WOLFSSL_API int wc_ShaGetHash(Sha* sha, byte* hash)
208 return hashGetHash(sha, hash, SHAMD5_ALGO_SHA1, SHA_DIGEST_SIZE) ;
211 WOLFSSL_API void wc_ShaRestorePos(Sha* s1, Sha* s2) {
212 hashRestorePos((wolfssl_TI_Hash *)s1, (wolfssl_TI_Hash *)s2) ;
215 WOLFSSL_API int wc_ShaHash(const byte*data, word32 len, byte*hash)
217 return hashHash(data, len, hash, SHAMD5_ALGO_SHA1, SHA_DIGEST_SIZE) ;
222 #if defined(HAVE_SHA224)
223 WOLFSSL_API int wc_InitSha224(Sha224* sha224)
227 if(!wolfSSL_TI_CCMInit())return 1 ;
228 return hashInit((wolfssl_TI_Hash *)sha224) ;
231 WOLFSSL_API int wc_Sha224Update(Sha224* sha224, const byte* data, word32 len)
233 return hashUpdate((wolfssl_TI_Hash *)sha224, data, len) ;
236 WOLFSSL_API int wc_Sha224Final(Sha224* sha224, byte* hash)
238 return hashFinal((wolfssl_TI_Hash *)sha224, hash, SHAMD5_ALGO_SHA224, SHA224_DIGEST_SIZE) ;
241 WOLFSSL_API int wc_Sha224GetHash(Sha224* sha224, byte* hash)
243 return hashGetHash(sha224, hash, SHAMD5_ALGO_SHA224, SHA224_DIGEST_SIZE) ;
246 WOLFSSL_API void wc_Sha224RestorePos(Sha224* s1, Sha224* s2) {
247 hashRestorePos((wolfssl_TI_Hash *)s1, (wolfssl_TI_Hash *)s2) ;
250 WOLFSSL_API int wc_Sha224Hash(const byte* data, word32 len, byte*hash)
252 return hashHash(data, len, hash, SHAMD5_ALGO_SHA224, SHA224_DIGEST_SIZE) ;
255 #endif /* HAVE_SHA224 */
257 #if !defined(NO_SHA256)
258 WOLFSSL_API int wc_InitSha256(Sha256* sha256)
262 if(!wolfSSL_TI_CCMInit())return 1 ;
263 return hashInit((wolfssl_TI_Hash *)sha256) ;
266 WOLFSSL_API int wc_Sha256Update(Sha256* sha256, const byte* data, word32 len)
268 return hashUpdate((wolfssl_TI_Hash *)sha256, data, len) ;
271 WOLFSSL_API int wc_Sha256Final(Sha256* sha256, byte* hash)
273 return hashFinal((wolfssl_TI_Hash *)sha256, hash, SHAMD5_ALGO_SHA256, SHA256_DIGEST_SIZE) ;
276 WOLFSSL_API int wc_Sha256GetHash(Sha256* sha256, byte* hash)
278 return hashGetHash(sha256, hash, SHAMD5_ALGO_SHA256, SHA256_DIGEST_SIZE) ;
281 WOLFSSL_API void wc_Sha256RestorePos(Sha256* s1, Sha256* s2) {
282 hashRestorePos((wolfssl_TI_Hash *)s1, (wolfssl_TI_Hash *)s2) ;
285 WOLFSSL_API int wc_Sha256Hash(const byte* data, word32 len, byte*hash)
287 return hashHash(data, len, hash, SHAMD5_ALGO_SHA256, SHA256_DIGEST_SIZE) ;