A simple CyaSSL-based HMAC-MD5 implementation. Licensed under GPL v2.

Dependents:   RFrec_full RFtrans_full

The output will be base64-encoded, with trailing "==", like this:

j62o/jZsAZD9i9m+32lIuQ==

Example

#include "mbed.h"
#include "hmac_md5.h"

Serial pc(USBTX, USBRX); // tx, rx

void main(void)
{
    
    const char * key = "MySecretKey";
    
    const char * text = "message to be signed";
    
    char output[26];
    
    HMAC_MD5(key, text, output);

    printf("result = %s\n", output);

    while(true){}
}
Committer:
igrokhotkov
Date:
Wed Feb 06 20:35:03 2013 +0000
Revision:
0:83f3dcfa5c8f
initial revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igrokhotkov 0:83f3dcfa5c8f 1 /* hmac.c
igrokhotkov 0:83f3dcfa5c8f 2 *
igrokhotkov 0:83f3dcfa5c8f 3 * Copyright (C) 2006-2012 Sawtooth Consulting Ltd.
igrokhotkov 0:83f3dcfa5c8f 4 *
igrokhotkov 0:83f3dcfa5c8f 5 * This file is part of CyaSSL.
igrokhotkov 0:83f3dcfa5c8f 6 *
igrokhotkov 0:83f3dcfa5c8f 7 * CyaSSL is free software; you can redistribute it and/or modify
igrokhotkov 0:83f3dcfa5c8f 8 * it under the terms of the GNU General Public License as published by
igrokhotkov 0:83f3dcfa5c8f 9 * the Free Software Foundation; either version 2 of the License, or
igrokhotkov 0:83f3dcfa5c8f 10 * (at your option) any later version.
igrokhotkov 0:83f3dcfa5c8f 11 *
igrokhotkov 0:83f3dcfa5c8f 12 * CyaSSL is distributed in the hope that it will be useful,
igrokhotkov 0:83f3dcfa5c8f 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
igrokhotkov 0:83f3dcfa5c8f 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
igrokhotkov 0:83f3dcfa5c8f 15 * GNU General Public License for more details.
igrokhotkov 0:83f3dcfa5c8f 16 *
igrokhotkov 0:83f3dcfa5c8f 17 * You should have received a copy of the GNU General Public License
igrokhotkov 0:83f3dcfa5c8f 18 * along with this program; if not, write to the Free Software
igrokhotkov 0:83f3dcfa5c8f 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
igrokhotkov 0:83f3dcfa5c8f 20 */
igrokhotkov 0:83f3dcfa5c8f 21
igrokhotkov 0:83f3dcfa5c8f 22 #ifdef HAVE_CONFIG_H
igrokhotkov 0:83f3dcfa5c8f 23 #include <config.h>
igrokhotkov 0:83f3dcfa5c8f 24 #endif
igrokhotkov 0:83f3dcfa5c8f 25
igrokhotkov 0:83f3dcfa5c8f 26 #ifndef NO_HMAC
igrokhotkov 0:83f3dcfa5c8f 27
igrokhotkov 0:83f3dcfa5c8f 28 #include "hmac.h"
igrokhotkov 0:83f3dcfa5c8f 29 #include "error.h"
igrokhotkov 0:83f3dcfa5c8f 30
igrokhotkov 0:83f3dcfa5c8f 31
igrokhotkov 0:83f3dcfa5c8f 32 #ifdef HAVE_CAVIUM
igrokhotkov 0:83f3dcfa5c8f 33 static void HmacCaviumFinal(Hmac* hmac, byte* hash);
igrokhotkov 0:83f3dcfa5c8f 34 static void HmacCaviumUpdate(Hmac* hmac, const byte* msg, word32 length);
igrokhotkov 0:83f3dcfa5c8f 35 static void HmacCaviumSetKey(Hmac* hmac, int type, const byte* key,
igrokhotkov 0:83f3dcfa5c8f 36 word32 length);
igrokhotkov 0:83f3dcfa5c8f 37 #endif
igrokhotkov 0:83f3dcfa5c8f 38
igrokhotkov 0:83f3dcfa5c8f 39
igrokhotkov 0:83f3dcfa5c8f 40 static int InitHmac(Hmac* hmac, int type)
igrokhotkov 0:83f3dcfa5c8f 41 {
igrokhotkov 0:83f3dcfa5c8f 42 hmac->innerHashKeyed = 0;
igrokhotkov 0:83f3dcfa5c8f 43 hmac->macType = (byte)type;
igrokhotkov 0:83f3dcfa5c8f 44
igrokhotkov 0:83f3dcfa5c8f 45 if (!(type == MD5 || type == SHA || type == SHA256 || type == SHA384))
igrokhotkov 0:83f3dcfa5c8f 46 return BAD_FUNC_ARG;
igrokhotkov 0:83f3dcfa5c8f 47
igrokhotkov 0:83f3dcfa5c8f 48 switch (type) {
igrokhotkov 0:83f3dcfa5c8f 49 #ifndef NO_MD5
igrokhotkov 0:83f3dcfa5c8f 50 case MD5:
igrokhotkov 0:83f3dcfa5c8f 51 InitMd5(&hmac->hash.md5);
igrokhotkov 0:83f3dcfa5c8f 52 break;
igrokhotkov 0:83f3dcfa5c8f 53 #endif
igrokhotkov 0:83f3dcfa5c8f 54 #ifndef NO_SHA
igrokhotkov 0:83f3dcfa5c8f 55 case SHA:
igrokhotkov 0:83f3dcfa5c8f 56 InitSha(&hmac->hash.sha);
igrokhotkov 0:83f3dcfa5c8f 57 break;
igrokhotkov 0:83f3dcfa5c8f 58 #endif
igrokhotkov 0:83f3dcfa5c8f 59 #ifndef NO_SHA256
igrokhotkov 0:83f3dcfa5c8f 60 case SHA256:
igrokhotkov 0:83f3dcfa5c8f 61 InitSha256(&hmac->hash.sha256);
igrokhotkov 0:83f3dcfa5c8f 62 break;
igrokhotkov 0:83f3dcfa5c8f 63 #endif
igrokhotkov 0:83f3dcfa5c8f 64
igrokhotkov 0:83f3dcfa5c8f 65 #ifdef CYASSL_SHA384
igrokhotkov 0:83f3dcfa5c8f 66 case SHA384:
igrokhotkov 0:83f3dcfa5c8f 67 InitSha384(&hmac->hash.sha384);
igrokhotkov 0:83f3dcfa5c8f 68 break;
igrokhotkov 0:83f3dcfa5c8f 69 #endif
igrokhotkov 0:83f3dcfa5c8f 70
igrokhotkov 0:83f3dcfa5c8f 71 default:
igrokhotkov 0:83f3dcfa5c8f 72 break;
igrokhotkov 0:83f3dcfa5c8f 73 }
igrokhotkov 0:83f3dcfa5c8f 74
igrokhotkov 0:83f3dcfa5c8f 75 return 0;
igrokhotkov 0:83f3dcfa5c8f 76 }
igrokhotkov 0:83f3dcfa5c8f 77
igrokhotkov 0:83f3dcfa5c8f 78
igrokhotkov 0:83f3dcfa5c8f 79 void HmacSetKey(Hmac* hmac, int type, const byte* key, word32 length)
igrokhotkov 0:83f3dcfa5c8f 80 {
igrokhotkov 0:83f3dcfa5c8f 81 byte* ip = (byte*) hmac->ipad;
igrokhotkov 0:83f3dcfa5c8f 82 byte* op = (byte*) hmac->opad;
igrokhotkov 0:83f3dcfa5c8f 83 word32 i, hmac_block_size = HMAC_BLOCK_SIZE;
igrokhotkov 0:83f3dcfa5c8f 84
igrokhotkov 0:83f3dcfa5c8f 85 #ifdef HAVE_CAVIUM
igrokhotkov 0:83f3dcfa5c8f 86 if (hmac->magic == CYASSL_HMAC_CAVIUM_MAGIC)
igrokhotkov 0:83f3dcfa5c8f 87 return HmacCaviumSetKey(hmac, type, key, length);
igrokhotkov 0:83f3dcfa5c8f 88 #endif
igrokhotkov 0:83f3dcfa5c8f 89
igrokhotkov 0:83f3dcfa5c8f 90 InitHmac(hmac, type);
igrokhotkov 0:83f3dcfa5c8f 91
igrokhotkov 0:83f3dcfa5c8f 92 switch (hmac->macType) {
igrokhotkov 0:83f3dcfa5c8f 93 #ifndef NO_MD5
igrokhotkov 0:83f3dcfa5c8f 94 case MD5:
igrokhotkov 0:83f3dcfa5c8f 95 {
igrokhotkov 0:83f3dcfa5c8f 96 hmac_block_size = MD5_BLOCK_SIZE;
igrokhotkov 0:83f3dcfa5c8f 97 if (length <= MD5_BLOCK_SIZE) {
igrokhotkov 0:83f3dcfa5c8f 98 XMEMCPY(ip, key, length);
igrokhotkov 0:83f3dcfa5c8f 99 }
igrokhotkov 0:83f3dcfa5c8f 100 else {
igrokhotkov 0:83f3dcfa5c8f 101 Md5Update(&hmac->hash.md5, key, length);
igrokhotkov 0:83f3dcfa5c8f 102 Md5Final(&hmac->hash.md5, ip);
igrokhotkov 0:83f3dcfa5c8f 103 length = MD5_DIGEST_SIZE;
igrokhotkov 0:83f3dcfa5c8f 104 }
igrokhotkov 0:83f3dcfa5c8f 105 }
igrokhotkov 0:83f3dcfa5c8f 106 break;
igrokhotkov 0:83f3dcfa5c8f 107 #endif
igrokhotkov 0:83f3dcfa5c8f 108 #ifndef NO_SHA
igrokhotkov 0:83f3dcfa5c8f 109 case SHA:
igrokhotkov 0:83f3dcfa5c8f 110 {
igrokhotkov 0:83f3dcfa5c8f 111 if (length <= SHA_BLOCK_SIZE) {
igrokhotkov 0:83f3dcfa5c8f 112 XMEMCPY(ip, key, length);
igrokhotkov 0:83f3dcfa5c8f 113 }
igrokhotkov 0:83f3dcfa5c8f 114 else {
igrokhotkov 0:83f3dcfa5c8f 115 ShaUpdate(&hmac->hash.sha, key, length);
igrokhotkov 0:83f3dcfa5c8f 116 ShaFinal(&hmac->hash.sha, ip);
igrokhotkov 0:83f3dcfa5c8f 117 length = SHA_DIGEST_SIZE;
igrokhotkov 0:83f3dcfa5c8f 118 }
igrokhotkov 0:83f3dcfa5c8f 119 }
igrokhotkov 0:83f3dcfa5c8f 120 break;
igrokhotkov 0:83f3dcfa5c8f 121 #endif
igrokhotkov 0:83f3dcfa5c8f 122 #ifndef NO_SHA256
igrokhotkov 0:83f3dcfa5c8f 123 case SHA256:
igrokhotkov 0:83f3dcfa5c8f 124 {
igrokhotkov 0:83f3dcfa5c8f 125 hmac_block_size = SHA256_BLOCK_SIZE;
igrokhotkov 0:83f3dcfa5c8f 126 if (length <= SHA256_BLOCK_SIZE) {
igrokhotkov 0:83f3dcfa5c8f 127 XMEMCPY(ip, key, length);
igrokhotkov 0:83f3dcfa5c8f 128 }
igrokhotkov 0:83f3dcfa5c8f 129 else {
igrokhotkov 0:83f3dcfa5c8f 130 Sha256Update(&hmac->hash.sha256, key, length);
igrokhotkov 0:83f3dcfa5c8f 131 Sha256Final(&hmac->hash.sha256, ip);
igrokhotkov 0:83f3dcfa5c8f 132 length = SHA256_DIGEST_SIZE;
igrokhotkov 0:83f3dcfa5c8f 133 }
igrokhotkov 0:83f3dcfa5c8f 134 }
igrokhotkov 0:83f3dcfa5c8f 135 break;
igrokhotkov 0:83f3dcfa5c8f 136 #endif
igrokhotkov 0:83f3dcfa5c8f 137
igrokhotkov 0:83f3dcfa5c8f 138 #ifdef CYASSL_SHA384
igrokhotkov 0:83f3dcfa5c8f 139 case SHA384:
igrokhotkov 0:83f3dcfa5c8f 140 {
igrokhotkov 0:83f3dcfa5c8f 141 hmac_block_size = SHA384_BLOCK_SIZE;
igrokhotkov 0:83f3dcfa5c8f 142 if (length <= SHA384_BLOCK_SIZE) {
igrokhotkov 0:83f3dcfa5c8f 143 XMEMCPY(ip, key, length);
igrokhotkov 0:83f3dcfa5c8f 144 }
igrokhotkov 0:83f3dcfa5c8f 145 else {
igrokhotkov 0:83f3dcfa5c8f 146 Sha384Update(&hmac->hash.sha384, key, length);
igrokhotkov 0:83f3dcfa5c8f 147 Sha384Final(&hmac->hash.sha384, ip);
igrokhotkov 0:83f3dcfa5c8f 148 length = SHA384_DIGEST_SIZE;
igrokhotkov 0:83f3dcfa5c8f 149 }
igrokhotkov 0:83f3dcfa5c8f 150 }
igrokhotkov 0:83f3dcfa5c8f 151 break;
igrokhotkov 0:83f3dcfa5c8f 152 #endif
igrokhotkov 0:83f3dcfa5c8f 153
igrokhotkov 0:83f3dcfa5c8f 154 default:
igrokhotkov 0:83f3dcfa5c8f 155 break;
igrokhotkov 0:83f3dcfa5c8f 156 }
igrokhotkov 0:83f3dcfa5c8f 157 XMEMSET(ip + length, 0, hmac_block_size - length);
igrokhotkov 0:83f3dcfa5c8f 158
igrokhotkov 0:83f3dcfa5c8f 159 for(i = 0; i < hmac_block_size; i++) {
igrokhotkov 0:83f3dcfa5c8f 160 op[i] = ip[i] ^ OPAD;
igrokhotkov 0:83f3dcfa5c8f 161 ip[i] ^= IPAD;
igrokhotkov 0:83f3dcfa5c8f 162 }
igrokhotkov 0:83f3dcfa5c8f 163 }
igrokhotkov 0:83f3dcfa5c8f 164
igrokhotkov 0:83f3dcfa5c8f 165
igrokhotkov 0:83f3dcfa5c8f 166 static void HmacKeyInnerHash(Hmac* hmac)
igrokhotkov 0:83f3dcfa5c8f 167 {
igrokhotkov 0:83f3dcfa5c8f 168 switch (hmac->macType) {
igrokhotkov 0:83f3dcfa5c8f 169 #ifndef NO_MD5
igrokhotkov 0:83f3dcfa5c8f 170 case MD5:
igrokhotkov 0:83f3dcfa5c8f 171 Md5Update(&hmac->hash.md5, (byte*) hmac->ipad, MD5_BLOCK_SIZE);
igrokhotkov 0:83f3dcfa5c8f 172 break;
igrokhotkov 0:83f3dcfa5c8f 173 #endif
igrokhotkov 0:83f3dcfa5c8f 174 #ifndef NO_SHA
igrokhotkov 0:83f3dcfa5c8f 175 case SHA:
igrokhotkov 0:83f3dcfa5c8f 176 ShaUpdate(&hmac->hash.sha, (byte*) hmac->ipad, SHA_BLOCK_SIZE);
igrokhotkov 0:83f3dcfa5c8f 177 break;
igrokhotkov 0:83f3dcfa5c8f 178 #endif
igrokhotkov 0:83f3dcfa5c8f 179 #ifndef NO_SHA256
igrokhotkov 0:83f3dcfa5c8f 180 case SHA256:
igrokhotkov 0:83f3dcfa5c8f 181 Sha256Update(&hmac->hash.sha256,
igrokhotkov 0:83f3dcfa5c8f 182 (byte*) hmac->ipad, SHA256_BLOCK_SIZE);
igrokhotkov 0:83f3dcfa5c8f 183 break;
igrokhotkov 0:83f3dcfa5c8f 184 #endif
igrokhotkov 0:83f3dcfa5c8f 185
igrokhotkov 0:83f3dcfa5c8f 186 #ifdef CYASSL_SHA384
igrokhotkov 0:83f3dcfa5c8f 187 case SHA384:
igrokhotkov 0:83f3dcfa5c8f 188 Sha384Update(&hmac->hash.sha384,
igrokhotkov 0:83f3dcfa5c8f 189 (byte*) hmac->ipad, SHA384_BLOCK_SIZE);
igrokhotkov 0:83f3dcfa5c8f 190 break;
igrokhotkov 0:83f3dcfa5c8f 191 #endif
igrokhotkov 0:83f3dcfa5c8f 192
igrokhotkov 0:83f3dcfa5c8f 193 default:
igrokhotkov 0:83f3dcfa5c8f 194 break;
igrokhotkov 0:83f3dcfa5c8f 195 }
igrokhotkov 0:83f3dcfa5c8f 196
igrokhotkov 0:83f3dcfa5c8f 197 hmac->innerHashKeyed = 1;
igrokhotkov 0:83f3dcfa5c8f 198 }
igrokhotkov 0:83f3dcfa5c8f 199
igrokhotkov 0:83f3dcfa5c8f 200
igrokhotkov 0:83f3dcfa5c8f 201 void HmacUpdate(Hmac* hmac, const byte* msg, word32 length)
igrokhotkov 0:83f3dcfa5c8f 202 {
igrokhotkov 0:83f3dcfa5c8f 203 #ifdef HAVE_CAVIUM
igrokhotkov 0:83f3dcfa5c8f 204 if (hmac->magic == CYASSL_HMAC_CAVIUM_MAGIC)
igrokhotkov 0:83f3dcfa5c8f 205 return HmacCaviumUpdate(hmac, msg, length);
igrokhotkov 0:83f3dcfa5c8f 206 #endif
igrokhotkov 0:83f3dcfa5c8f 207
igrokhotkov 0:83f3dcfa5c8f 208 if (!hmac->innerHashKeyed)
igrokhotkov 0:83f3dcfa5c8f 209 HmacKeyInnerHash(hmac);
igrokhotkov 0:83f3dcfa5c8f 210
igrokhotkov 0:83f3dcfa5c8f 211 switch (hmac->macType) {
igrokhotkov 0:83f3dcfa5c8f 212 #ifndef NO_MD5
igrokhotkov 0:83f3dcfa5c8f 213 case MD5:
igrokhotkov 0:83f3dcfa5c8f 214 Md5Update(&hmac->hash.md5, msg, length);
igrokhotkov 0:83f3dcfa5c8f 215 break;
igrokhotkov 0:83f3dcfa5c8f 216 #endif
igrokhotkov 0:83f3dcfa5c8f 217 #ifndef NO_SHA
igrokhotkov 0:83f3dcfa5c8f 218 case SHA:
igrokhotkov 0:83f3dcfa5c8f 219 ShaUpdate(&hmac->hash.sha, msg, length);
igrokhotkov 0:83f3dcfa5c8f 220 break;
igrokhotkov 0:83f3dcfa5c8f 221 #endif
igrokhotkov 0:83f3dcfa5c8f 222 #ifndef NO_SHA256
igrokhotkov 0:83f3dcfa5c8f 223 case SHA256:
igrokhotkov 0:83f3dcfa5c8f 224 Sha256Update(&hmac->hash.sha256, msg, length);
igrokhotkov 0:83f3dcfa5c8f 225 break;
igrokhotkov 0:83f3dcfa5c8f 226 #endif
igrokhotkov 0:83f3dcfa5c8f 227
igrokhotkov 0:83f3dcfa5c8f 228 #ifdef CYASSL_SHA384
igrokhotkov 0:83f3dcfa5c8f 229 case SHA384:
igrokhotkov 0:83f3dcfa5c8f 230 Sha384Update(&hmac->hash.sha384, msg, length);
igrokhotkov 0:83f3dcfa5c8f 231 break;
igrokhotkov 0:83f3dcfa5c8f 232 #endif
igrokhotkov 0:83f3dcfa5c8f 233
igrokhotkov 0:83f3dcfa5c8f 234 default:
igrokhotkov 0:83f3dcfa5c8f 235 break;
igrokhotkov 0:83f3dcfa5c8f 236 }
igrokhotkov 0:83f3dcfa5c8f 237
igrokhotkov 0:83f3dcfa5c8f 238 }
igrokhotkov 0:83f3dcfa5c8f 239
igrokhotkov 0:83f3dcfa5c8f 240
igrokhotkov 0:83f3dcfa5c8f 241 void HmacFinal(Hmac* hmac, byte* hash)
igrokhotkov 0:83f3dcfa5c8f 242 {
igrokhotkov 0:83f3dcfa5c8f 243 #ifdef HAVE_CAVIUM
igrokhotkov 0:83f3dcfa5c8f 244 if (hmac->magic == CYASSL_HMAC_CAVIUM_MAGIC)
igrokhotkov 0:83f3dcfa5c8f 245 return HmacCaviumFinal(hmac, hash);
igrokhotkov 0:83f3dcfa5c8f 246 #endif
igrokhotkov 0:83f3dcfa5c8f 247
igrokhotkov 0:83f3dcfa5c8f 248 if (!hmac->innerHashKeyed)
igrokhotkov 0:83f3dcfa5c8f 249 HmacKeyInnerHash(hmac);
igrokhotkov 0:83f3dcfa5c8f 250
igrokhotkov 0:83f3dcfa5c8f 251 switch (hmac->macType) {
igrokhotkov 0:83f3dcfa5c8f 252 #ifndef NO_MD5
igrokhotkov 0:83f3dcfa5c8f 253 case MD5:
igrokhotkov 0:83f3dcfa5c8f 254 {
igrokhotkov 0:83f3dcfa5c8f 255 Md5Final(&hmac->hash.md5, (byte*) hmac->innerHash);
igrokhotkov 0:83f3dcfa5c8f 256
igrokhotkov 0:83f3dcfa5c8f 257 Md5Update(&hmac->hash.md5, (byte*) hmac->opad, MD5_BLOCK_SIZE);
igrokhotkov 0:83f3dcfa5c8f 258 Md5Update(&hmac->hash.md5,
igrokhotkov 0:83f3dcfa5c8f 259 (byte*) hmac->innerHash, MD5_DIGEST_SIZE);
igrokhotkov 0:83f3dcfa5c8f 260
igrokhotkov 0:83f3dcfa5c8f 261 Md5Final(&hmac->hash.md5, hash);
igrokhotkov 0:83f3dcfa5c8f 262 }
igrokhotkov 0:83f3dcfa5c8f 263 break;
igrokhotkov 0:83f3dcfa5c8f 264 #endif
igrokhotkov 0:83f3dcfa5c8f 265 #ifndef NO_SHA
igrokhotkov 0:83f3dcfa5c8f 266 case SHA:
igrokhotkov 0:83f3dcfa5c8f 267 {
igrokhotkov 0:83f3dcfa5c8f 268 ShaFinal(&hmac->hash.sha, (byte*) hmac->innerHash);
igrokhotkov 0:83f3dcfa5c8f 269
igrokhotkov 0:83f3dcfa5c8f 270 ShaUpdate(&hmac->hash.sha, (byte*) hmac->opad, SHA_BLOCK_SIZE);
igrokhotkov 0:83f3dcfa5c8f 271 ShaUpdate(&hmac->hash.sha,
igrokhotkov 0:83f3dcfa5c8f 272 (byte*) hmac->innerHash, SHA_DIGEST_SIZE);
igrokhotkov 0:83f3dcfa5c8f 273
igrokhotkov 0:83f3dcfa5c8f 274 ShaFinal(&hmac->hash.sha, hash);
igrokhotkov 0:83f3dcfa5c8f 275 }
igrokhotkov 0:83f3dcfa5c8f 276 break;
igrokhotkov 0:83f3dcfa5c8f 277 #endif
igrokhotkov 0:83f3dcfa5c8f 278 #ifndef NO_SHA256
igrokhotkov 0:83f3dcfa5c8f 279 case SHA256:
igrokhotkov 0:83f3dcfa5c8f 280 {
igrokhotkov 0:83f3dcfa5c8f 281 Sha256Final(&hmac->hash.sha256, (byte*) hmac->innerHash);
igrokhotkov 0:83f3dcfa5c8f 282
igrokhotkov 0:83f3dcfa5c8f 283 Sha256Update(&hmac->hash.sha256,
igrokhotkov 0:83f3dcfa5c8f 284 (byte*) hmac->opad, SHA256_BLOCK_SIZE);
igrokhotkov 0:83f3dcfa5c8f 285 Sha256Update(&hmac->hash.sha256,
igrokhotkov 0:83f3dcfa5c8f 286 (byte*) hmac->innerHash, SHA256_DIGEST_SIZE);
igrokhotkov 0:83f3dcfa5c8f 287
igrokhotkov 0:83f3dcfa5c8f 288 Sha256Final(&hmac->hash.sha256, hash);
igrokhotkov 0:83f3dcfa5c8f 289 }
igrokhotkov 0:83f3dcfa5c8f 290 break;
igrokhotkov 0:83f3dcfa5c8f 291 #endif
igrokhotkov 0:83f3dcfa5c8f 292
igrokhotkov 0:83f3dcfa5c8f 293 #ifdef CYASSL_SHA384
igrokhotkov 0:83f3dcfa5c8f 294 case SHA384:
igrokhotkov 0:83f3dcfa5c8f 295 {
igrokhotkov 0:83f3dcfa5c8f 296 Sha384Final(&hmac->hash.sha384, (byte*) hmac->innerHash);
igrokhotkov 0:83f3dcfa5c8f 297
igrokhotkov 0:83f3dcfa5c8f 298 Sha384Update(&hmac->hash.sha384,
igrokhotkov 0:83f3dcfa5c8f 299 (byte*) hmac->opad, SHA384_BLOCK_SIZE);
igrokhotkov 0:83f3dcfa5c8f 300 Sha384Update(&hmac->hash.sha384,
igrokhotkov 0:83f3dcfa5c8f 301 (byte*) hmac->innerHash, SHA384_DIGEST_SIZE);
igrokhotkov 0:83f3dcfa5c8f 302
igrokhotkov 0:83f3dcfa5c8f 303 Sha384Final(&hmac->hash.sha384, hash);
igrokhotkov 0:83f3dcfa5c8f 304 }
igrokhotkov 0:83f3dcfa5c8f 305 break;
igrokhotkov 0:83f3dcfa5c8f 306 #endif
igrokhotkov 0:83f3dcfa5c8f 307
igrokhotkov 0:83f3dcfa5c8f 308 default:
igrokhotkov 0:83f3dcfa5c8f 309 break;
igrokhotkov 0:83f3dcfa5c8f 310 }
igrokhotkov 0:83f3dcfa5c8f 311
igrokhotkov 0:83f3dcfa5c8f 312 hmac->innerHashKeyed = 0;
igrokhotkov 0:83f3dcfa5c8f 313 }
igrokhotkov 0:83f3dcfa5c8f 314
igrokhotkov 0:83f3dcfa5c8f 315
igrokhotkov 0:83f3dcfa5c8f 316 #ifdef HAVE_CAVIUM
igrokhotkov 0:83f3dcfa5c8f 317
igrokhotkov 0:83f3dcfa5c8f 318 /* Initiliaze Hmac for use with Nitrox device */
igrokhotkov 0:83f3dcfa5c8f 319 int HmacInitCavium(Hmac* hmac, int devId)
igrokhotkov 0:83f3dcfa5c8f 320 {
igrokhotkov 0:83f3dcfa5c8f 321 if (hmac == NULL)
igrokhotkov 0:83f3dcfa5c8f 322 return -1;
igrokhotkov 0:83f3dcfa5c8f 323
igrokhotkov 0:83f3dcfa5c8f 324 if (CspAllocContext(CONTEXT_SSL, &hmac->contextHandle, devId) != 0)
igrokhotkov 0:83f3dcfa5c8f 325 return -1;
igrokhotkov 0:83f3dcfa5c8f 326
igrokhotkov 0:83f3dcfa5c8f 327 hmac->keyLen = 0;
igrokhotkov 0:83f3dcfa5c8f 328 hmac->dataLen = 0;
igrokhotkov 0:83f3dcfa5c8f 329 hmac->type = 0;
igrokhotkov 0:83f3dcfa5c8f 330 hmac->devId = devId;
igrokhotkov 0:83f3dcfa5c8f 331 hmac->magic = CYASSL_HMAC_CAVIUM_MAGIC;
igrokhotkov 0:83f3dcfa5c8f 332 hmac->data = NULL; /* buffered input data */
igrokhotkov 0:83f3dcfa5c8f 333
igrokhotkov 0:83f3dcfa5c8f 334 hmac->innerHashKeyed = 0;
igrokhotkov 0:83f3dcfa5c8f 335
igrokhotkov 0:83f3dcfa5c8f 336 return 0;
igrokhotkov 0:83f3dcfa5c8f 337 }
igrokhotkov 0:83f3dcfa5c8f 338
igrokhotkov 0:83f3dcfa5c8f 339
igrokhotkov 0:83f3dcfa5c8f 340 /* Free Hmac from use with Nitrox device */
igrokhotkov 0:83f3dcfa5c8f 341 void HmacFreeCavium(Hmac* hmac)
igrokhotkov 0:83f3dcfa5c8f 342 {
igrokhotkov 0:83f3dcfa5c8f 343 if (hmac == NULL)
igrokhotkov 0:83f3dcfa5c8f 344 return;
igrokhotkov 0:83f3dcfa5c8f 345
igrokhotkov 0:83f3dcfa5c8f 346 CspFreeContext(CONTEXT_SSL, hmac->contextHandle, hmac->devId);
igrokhotkov 0:83f3dcfa5c8f 347 hmac->magic = 0;
igrokhotkov 0:83f3dcfa5c8f 348 XFREE(hmac->data, NULL, DYNAMIC_TYPE_CAVIUM_TMP);
igrokhotkov 0:83f3dcfa5c8f 349 hmac->data = NULL;
igrokhotkov 0:83f3dcfa5c8f 350 }
igrokhotkov 0:83f3dcfa5c8f 351
igrokhotkov 0:83f3dcfa5c8f 352
igrokhotkov 0:83f3dcfa5c8f 353 static void HmacCaviumFinal(Hmac* hmac, byte* hash)
igrokhotkov 0:83f3dcfa5c8f 354 {
igrokhotkov 0:83f3dcfa5c8f 355 word32 requestId;
igrokhotkov 0:83f3dcfa5c8f 356
igrokhotkov 0:83f3dcfa5c8f 357 if (CspHmac(CAVIUM_BLOCKING, hmac->type, NULL, hmac->keyLen,
igrokhotkov 0:83f3dcfa5c8f 358 (byte*)hmac->ipad, hmac->dataLen, hmac->data, hash, &requestId,
igrokhotkov 0:83f3dcfa5c8f 359 hmac->devId) != 0) {
igrokhotkov 0:83f3dcfa5c8f 360 CYASSL_MSG("Cavium Hmac failed");
igrokhotkov 0:83f3dcfa5c8f 361 }
igrokhotkov 0:83f3dcfa5c8f 362 hmac->innerHashKeyed = 0; /* tell update to start over if used again */
igrokhotkov 0:83f3dcfa5c8f 363 }
igrokhotkov 0:83f3dcfa5c8f 364
igrokhotkov 0:83f3dcfa5c8f 365
igrokhotkov 0:83f3dcfa5c8f 366 static void HmacCaviumUpdate(Hmac* hmac, const byte* msg, word32 length)
igrokhotkov 0:83f3dcfa5c8f 367 {
igrokhotkov 0:83f3dcfa5c8f 368 word16 add = (word16)length;
igrokhotkov 0:83f3dcfa5c8f 369 word32 total;
igrokhotkov 0:83f3dcfa5c8f 370 byte* tmp;
igrokhotkov 0:83f3dcfa5c8f 371
igrokhotkov 0:83f3dcfa5c8f 372 if (length > CYASSL_MAX_16BIT) {
igrokhotkov 0:83f3dcfa5c8f 373 CYASSL_MSG("Too big msg for cavium hmac");
igrokhotkov 0:83f3dcfa5c8f 374 return;
igrokhotkov 0:83f3dcfa5c8f 375 }
igrokhotkov 0:83f3dcfa5c8f 376
igrokhotkov 0:83f3dcfa5c8f 377 if (hmac->innerHashKeyed == 0) { /* starting new */
igrokhotkov 0:83f3dcfa5c8f 378 hmac->dataLen = 0;
igrokhotkov 0:83f3dcfa5c8f 379 hmac->innerHashKeyed = 1;
igrokhotkov 0:83f3dcfa5c8f 380 }
igrokhotkov 0:83f3dcfa5c8f 381
igrokhotkov 0:83f3dcfa5c8f 382 total = add + hmac->dataLen;
igrokhotkov 0:83f3dcfa5c8f 383 if (total > CYASSL_MAX_16BIT) {
igrokhotkov 0:83f3dcfa5c8f 384 CYASSL_MSG("Too big msg for cavium hmac");
igrokhotkov 0:83f3dcfa5c8f 385 return;
igrokhotkov 0:83f3dcfa5c8f 386 }
igrokhotkov 0:83f3dcfa5c8f 387
igrokhotkov 0:83f3dcfa5c8f 388 tmp = XMALLOC(hmac->dataLen + add, NULL,DYNAMIC_TYPE_CAVIUM_TMP);
igrokhotkov 0:83f3dcfa5c8f 389 if (tmp == NULL) {
igrokhotkov 0:83f3dcfa5c8f 390 CYASSL_MSG("Out of memory for cavium update");
igrokhotkov 0:83f3dcfa5c8f 391 return;
igrokhotkov 0:83f3dcfa5c8f 392 }
igrokhotkov 0:83f3dcfa5c8f 393 if (hmac->dataLen)
igrokhotkov 0:83f3dcfa5c8f 394 XMEMCPY(tmp, hmac->data, hmac->dataLen);
igrokhotkov 0:83f3dcfa5c8f 395 XMEMCPY(tmp + hmac->dataLen, msg, add);
igrokhotkov 0:83f3dcfa5c8f 396
igrokhotkov 0:83f3dcfa5c8f 397 hmac->dataLen += add;
igrokhotkov 0:83f3dcfa5c8f 398 XFREE(hmac->data, NULL, DYNAMIC_TYPE_CAVIUM_TMP);
igrokhotkov 0:83f3dcfa5c8f 399 hmac->data = tmp;
igrokhotkov 0:83f3dcfa5c8f 400 }
igrokhotkov 0:83f3dcfa5c8f 401
igrokhotkov 0:83f3dcfa5c8f 402
igrokhotkov 0:83f3dcfa5c8f 403 static void HmacCaviumSetKey(Hmac* hmac, int type, const byte* key,
igrokhotkov 0:83f3dcfa5c8f 404 word32 length)
igrokhotkov 0:83f3dcfa5c8f 405 {
igrokhotkov 0:83f3dcfa5c8f 406 hmac->macType = (byte)type;
igrokhotkov 0:83f3dcfa5c8f 407 if (type == MD5)
igrokhotkov 0:83f3dcfa5c8f 408 hmac->type = MD5_TYPE;
igrokhotkov 0:83f3dcfa5c8f 409 else if (type == SHA)
igrokhotkov 0:83f3dcfa5c8f 410 hmac->type = SHA1_TYPE;
igrokhotkov 0:83f3dcfa5c8f 411 else if (type == SHA256)
igrokhotkov 0:83f3dcfa5c8f 412 hmac->type = SHA256_TYPE;
igrokhotkov 0:83f3dcfa5c8f 413 else {
igrokhotkov 0:83f3dcfa5c8f 414 CYASSL_MSG("unsupported cavium hmac type");
igrokhotkov 0:83f3dcfa5c8f 415 }
igrokhotkov 0:83f3dcfa5c8f 416
igrokhotkov 0:83f3dcfa5c8f 417 hmac->innerHashKeyed = 0; /* should we key Startup flag */
igrokhotkov 0:83f3dcfa5c8f 418
igrokhotkov 0:83f3dcfa5c8f 419 hmac->keyLen = (word16)length;
igrokhotkov 0:83f3dcfa5c8f 420 /* store key in ipad */
igrokhotkov 0:83f3dcfa5c8f 421 XMEMCPY(hmac->ipad, key, length);
igrokhotkov 0:83f3dcfa5c8f 422 }
igrokhotkov 0:83f3dcfa5c8f 423
igrokhotkov 0:83f3dcfa5c8f 424 #endif /* HAVE_CAVIUM */
igrokhotkov 0:83f3dcfa5c8f 425
igrokhotkov 0:83f3dcfa5c8f 426 #endif /* NO_HMAC */
igrokhotkov 0:83f3dcfa5c8f 427