hmac.c revision 392aa7cc7d2b122614c5393c3e357da07fd07af3
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/hmac/hmac.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com). 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to. The following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed. 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package. 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in the 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * documentation and/or other materials provided with the distribution. 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * must display the following acknowledgement: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes cryptographic software written by 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The word 'cryptographic' can be left out if the rouines from the library 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * being used are not cryptographic related :-). 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h> 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h" 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/hmac.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 64392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS 65392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include <openssl/fips.h> 66392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 67392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 68221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len, 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EVP_MD *md, ENGINE *impl) 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i,j,reset=0; 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char pad[HMAC_MAX_MD_CBLOCK]; 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 74392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS 75392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (FIPS_mode()) 76392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 77392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /* If we have an ENGINE need to allow non FIPS */ 78392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if ((impl || ctx->i_ctx.engine) 79392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom && !(ctx->i_ctx.flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW)) 80392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 81392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVPerr(EVP_F_HMAC_INIT_EX, EVP_R_DISABLED_FOR_FIPS); 82392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return 0; 83392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 84392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom /* Other algorithm blocking will be done in FIPS_cmac_init, 85392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom * via FIPS_hmac_init_ex(). 86392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom */ 87392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (!impl && !ctx->i_ctx.engine) 88392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return FIPS_hmac_init_ex(ctx, key, len, md, NULL); 89392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 90392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 91392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (md != NULL) 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project reset=1; 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ctx->md=md; 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project md=ctx->md; 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (key != NULL) 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project reset=1; 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project j=EVP_MD_block_size(md); 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_assert(j <= (int)sizeof(ctx->key)); 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (j < len) 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_DigestInit_ex(&ctx->md_ctx,md, impl)) 108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_DigestUpdate(&ctx->md_ctx,key,len)) 110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_DigestFinal_ex(&(ctx->md_ctx),ctx->key, 112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom &ctx->key_length)) 113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_assert(len>=0 && len<=(int)sizeof(ctx->key)); 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memcpy(ctx->key,key,len); 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ctx->key_length=len; 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(ctx->key_length != HMAC_MAX_MD_CBLOCK) 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(&ctx->key[ctx->key_length], 0, 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project HMAC_MAX_MD_CBLOCK - ctx->key_length); 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (reset) 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pad[i]=0x36^ctx->key[i]; 130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_DigestInit_ex(&ctx->i_ctx,md, impl)) 131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_DigestUpdate(&ctx->i_ctx,pad,EVP_MD_block_size(md))) 133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project pad[i]=0x5c^ctx->key[i]; 137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_DigestInit_ex(&ctx->o_ctx,md, impl)) 138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_DigestUpdate(&ctx->o_ctx,pad,EVP_MD_block_size(md))) 140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->i_ctx)) 143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom err: 146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint HMAC_Init(HMAC_CTX *ctx, const void *key, int len, const EVP_MD *md) 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(key && md) 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project HMAC_CTX_init(ctx); 153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return HMAC_Init_ex(ctx,key,len,md, NULL); 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len) 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 158392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS 159392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (FIPS_mode() && !ctx->i_ctx.engine) 160392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return FIPS_hmac_update(ctx, data, len); 161392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return EVP_DigestUpdate(&ctx->md_ctx,data,len); 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len) 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned int i; 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char buf[EVP_MAX_MD_SIZE]; 169392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS 170392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (FIPS_mode() && !ctx->i_ctx.engine) 171392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return FIPS_hmac_final(ctx, md, len); 172392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_DigestFinal_ex(&ctx->md_ctx,buf,&i)) 175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->o_ctx)) 177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_DigestUpdate(&ctx->md_ctx,buf,i)) 179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_DigestFinal_ex(&ctx->md_ctx,md,len)) 181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom err: 184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid HMAC_CTX_init(HMAC_CTX *ctx) 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_MD_CTX_init(&ctx->i_ctx); 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_MD_CTX_init(&ctx->o_ctx); 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_MD_CTX_init(&ctx->md_ctx); 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx) 195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_MD_CTX_copy(&dctx->i_ctx, &sctx->i_ctx)) 197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_MD_CTX_copy(&dctx->o_ctx, &sctx->o_ctx)) 199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!EVP_MD_CTX_copy(&dctx->md_ctx, &sctx->md_ctx)) 201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom memcpy(dctx->key, sctx->key, HMAC_MAX_MD_CBLOCK); 203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dctx->key_length = sctx->key_length; 204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom dctx->md = sctx->md; 205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom err: 207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 0; 208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid HMAC_CTX_cleanup(HMAC_CTX *ctx) 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 212392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS 213392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (FIPS_mode() && !ctx->i_ctx.engine) 214392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 215392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom FIPS_hmac_ctx_cleanup(ctx); 216392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom return; 217392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 218392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif 219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_MD_CTX_cleanup(&ctx->i_ctx); 220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_MD_CTX_cleanup(&ctx->o_ctx); 221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_MD_CTX_cleanup(&ctx->md_ctx); 222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project memset(ctx,0,sizeof *ctx); 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectunsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const unsigned char *d, size_t n, unsigned char *md, 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned int *md_len) 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project HMAC_CTX c; 230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static unsigned char m[EVP_MAX_MD_SIZE]; 231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (md == NULL) md=m; 233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project HMAC_CTX_init(&c); 234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!HMAC_Init(&c,key,key_len,evp_md)) 235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!HMAC_Update(&c,d,n)) 237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!HMAC_Final(&c,md,md_len)) 239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto err; 240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project HMAC_CTX_cleanup(&c); 241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return md; 242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom err: 243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return NULL; 244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 246e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguvoid HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags) 247e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 248e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu EVP_MD_CTX_set_flags(&ctx->i_ctx, flags); 249e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu EVP_MD_CTX_set_flags(&ctx->o_ctx, flags); 250e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu EVP_MD_CTX_set_flags(&ctx->md_ctx, flags); 251e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 252