summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/hmac
diff options
context:
space:
mode:
authormarkus <>2002-09-05 12:51:50 +0000
committermarkus <>2002-09-05 12:51:50 +0000
commit15b5d84f9da2ce4bfae8580e56e34a859f74ad71 (patch)
treebf939e82d7fd73cc8a01cf6959002209972091bc /src/lib/libcrypto/hmac
parent027351f729b9e837200dae6e1520cda6577ab930 (diff)
downloadopenbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.gz
openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.tar.bz2
openbsd-15b5d84f9da2ce4bfae8580e56e34a859f74ad71.zip
import openssl-0.9.7-beta1
Diffstat (limited to 'src/lib/libcrypto/hmac')
-rw-r--r--src/lib/libcrypto/hmac/hmac.c79
-rw-r--r--src/lib/libcrypto/hmac/hmac.h40
2 files changed, 62 insertions, 57 deletions
diff --git a/src/lib/libcrypto/hmac/hmac.c b/src/lib/libcrypto/hmac/hmac.c
index fb09129963..da363b7950 100644
--- a/src/lib/libcrypto/hmac/hmac.c
+++ b/src/lib/libcrypto/hmac/hmac.c
@@ -58,13 +58,10 @@
58#include <stdio.h> 58#include <stdio.h>
59#include <stdlib.h> 59#include <stdlib.h>
60#include <string.h> 60#include <string.h>
61#include "hmac.h" 61#include <openssl/hmac.h>
62 62
63void HMAC_Init(ctx,key,len,md) 63void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,
64HMAC_CTX *ctx; 64 const EVP_MD *md, ENGINE *impl)
65unsigned char *key;
66int len;
67EVP_MD *md;
68 { 65 {
69 int i,j,reset=0; 66 int i,j,reset=0;
70 unsigned char pad[HMAC_MAX_MD_CBLOCK]; 67 unsigned char pad[HMAC_MAX_MD_CBLOCK];
@@ -83,47 +80,50 @@ EVP_MD *md;
83 j=EVP_MD_block_size(md); 80 j=EVP_MD_block_size(md);
84 if (j < len) 81 if (j < len)
85 { 82 {
86 EVP_DigestInit(&ctx->md_ctx,md); 83 EVP_DigestInit_ex(&ctx->md_ctx,md, impl);
87 EVP_DigestUpdate(&ctx->md_ctx,key,len); 84 EVP_DigestUpdate(&ctx->md_ctx,key,len);
88 EVP_DigestFinal(&(ctx->md_ctx),ctx->key, 85 EVP_DigestFinal_ex(&(ctx->md_ctx),ctx->key,
89 &ctx->key_length); 86 &ctx->key_length);
90 } 87 }
91 else 88 else
92 { 89 {
93 memcpy(ctx->key,key,len); 90 memcpy(ctx->key,key,len);
94 memset(&(ctx->key[len]),0,sizeof(ctx->key)-len);
95 ctx->key_length=len; 91 ctx->key_length=len;
96 } 92 }
93 if(ctx->key_length != HMAC_MAX_MD_CBLOCK)
94 memset(&ctx->key[ctx->key_length], 0,
95 HMAC_MAX_MD_CBLOCK - ctx->key_length);
97 } 96 }
98 97
99 if (reset) 98 if (reset)
100 { 99 {
101 for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) 100 for (i=0; i<HMAC_MAX_MD_CBLOCK; i++)
102 pad[i]=0x36^ctx->key[i]; 101 pad[i]=0x36^ctx->key[i];
103 EVP_DigestInit(&ctx->i_ctx,md); 102 EVP_DigestInit_ex(&ctx->i_ctx,md, impl);
104 EVP_DigestUpdate(&ctx->i_ctx,pad,EVP_MD_block_size(md)); 103 EVP_DigestUpdate(&ctx->i_ctx,pad,EVP_MD_block_size(md));
105 104
106 for (i=0; i<HMAC_MAX_MD_CBLOCK; i++) 105 for (i=0; i<HMAC_MAX_MD_CBLOCK; i++)
107 pad[i]=0x5c^ctx->key[i]; 106 pad[i]=0x5c^ctx->key[i];
108 EVP_DigestInit(&ctx->o_ctx,md); 107 EVP_DigestInit_ex(&ctx->o_ctx,md, impl);
109 EVP_DigestUpdate(&ctx->o_ctx,pad,EVP_MD_block_size(md)); 108 EVP_DigestUpdate(&ctx->o_ctx,pad,EVP_MD_block_size(md));
110 } 109 }
110 EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->i_ctx);
111 }
111 112
112 memcpy(&ctx->md_ctx,&ctx->i_ctx,sizeof(ctx->i_ctx)); 113void HMAC_Init(HMAC_CTX *ctx, const void *key, int len,
114 const EVP_MD *md)
115 {
116 if(key && md)
117 HMAC_CTX_init(ctx);
118 HMAC_Init_ex(ctx,key,len,md, NULL);
113 } 119 }
114 120
115void HMAC_Update(ctx,data,len) 121void HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, int len)
116HMAC_CTX *ctx;
117unsigned char *data;
118int len;
119 { 122 {
120 EVP_DigestUpdate(&(ctx->md_ctx),data,len); 123 EVP_DigestUpdate(&ctx->md_ctx,data,len);
121 } 124 }
122 125
123void HMAC_Final(ctx,md,len) 126void HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len)
124HMAC_CTX *ctx;
125unsigned char *md;
126unsigned int *len;
127 { 127 {
128 int j; 128 int j;
129 unsigned int i; 129 unsigned int i;
@@ -131,35 +131,40 @@ unsigned int *len;
131 131
132 j=EVP_MD_block_size(ctx->md); 132 j=EVP_MD_block_size(ctx->md);
133 133
134 EVP_DigestFinal(&(ctx->md_ctx),buf,&i); 134 EVP_DigestFinal_ex(&ctx->md_ctx,buf,&i);
135 memcpy(&(ctx->md_ctx),&(ctx->o_ctx),sizeof(ctx->o_ctx)); 135 EVP_MD_CTX_copy_ex(&ctx->md_ctx,&ctx->o_ctx);
136 EVP_DigestUpdate(&(ctx->md_ctx),buf,i); 136 EVP_DigestUpdate(&ctx->md_ctx,buf,i);
137 EVP_DigestFinal(&(ctx->md_ctx),md,len); 137 EVP_DigestFinal_ex(&ctx->md_ctx,md,len);
138 }
139
140void HMAC_CTX_init(HMAC_CTX *ctx)
141 {
142 EVP_MD_CTX_init(&ctx->i_ctx);
143 EVP_MD_CTX_init(&ctx->o_ctx);
144 EVP_MD_CTX_init(&ctx->md_ctx);
138 } 145 }
139 146
140void HMAC_cleanup(ctx) 147void HMAC_CTX_cleanup(HMAC_CTX *ctx)
141HMAC_CTX *ctx;
142 { 148 {
143 memset(ctx,0,sizeof(HMAC_CTX)); 149 EVP_MD_CTX_cleanup(&ctx->i_ctx);
150 EVP_MD_CTX_cleanup(&ctx->o_ctx);
151 EVP_MD_CTX_cleanup(&ctx->md_ctx);
152 memset(ctx,0,sizeof *ctx);
144 } 153 }
145 154
146unsigned char *HMAC(evp_md,key,key_len,d,n,md,md_len) 155unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,
147EVP_MD *evp_md; 156 const unsigned char *d, int n, unsigned char *md,
148unsigned char *key; 157 unsigned int *md_len)
149int key_len;
150unsigned char *d;
151int n;
152unsigned char *md;
153unsigned int *md_len;
154 { 158 {
155 HMAC_CTX c; 159 HMAC_CTX c;
156 static unsigned char m[EVP_MAX_MD_SIZE]; 160 static unsigned char m[EVP_MAX_MD_SIZE];
157 161
158 if (md == NULL) md=m; 162 if (md == NULL) md=m;
163 HMAC_CTX_init(&c);
159 HMAC_Init(&c,key,key_len,evp_md); 164 HMAC_Init(&c,key,key_len,evp_md);
160 HMAC_Update(&c,d,n); 165 HMAC_Update(&c,d,n);
161 HMAC_Final(&c,md,md_len); 166 HMAC_Final(&c,md,md_len);
162 HMAC_cleanup(&c); 167 HMAC_CTX_cleanup(&c);
163 return(md); 168 return(md);
164 } 169 }
165 170
diff --git a/src/lib/libcrypto/hmac/hmac.h b/src/lib/libcrypto/hmac/hmac.h
index e6b43f52c4..0364a1fcbd 100644
--- a/src/lib/libcrypto/hmac/hmac.h
+++ b/src/lib/libcrypto/hmac/hmac.h
@@ -58,17 +58,21 @@
58#ifndef HEADER_HMAC_H 58#ifndef HEADER_HMAC_H
59#define HEADER_HMAC_H 59#define HEADER_HMAC_H
60 60
61#ifdef __cplusplus 61#ifdef OPENSSL_NO_HMAC
62extern "C" { 62#error HMAC is disabled.
63#endif 63#endif
64 64
65#include "evp.h" 65#include <openssl/evp.h>
66 66
67#define HMAC_MAX_MD_CBLOCK 64 67#define HMAC_MAX_MD_CBLOCK 64
68 68
69#ifdef __cplusplus
70extern "C" {
71#endif
72
69typedef struct hmac_ctx_st 73typedef struct hmac_ctx_st
70 { 74 {
71 EVP_MD *md; 75 const EVP_MD *md;
72 EVP_MD_CTX md_ctx; 76 EVP_MD_CTX md_ctx;
73 EVP_MD_CTX i_ctx; 77 EVP_MD_CTX i_ctx;
74 EVP_MD_CTX o_ctx; 78 EVP_MD_CTX o_ctx;
@@ -78,26 +82,22 @@ typedef struct hmac_ctx_st
78 82
79#define HMAC_size(e) (EVP_MD_size((e)->md)) 83#define HMAC_size(e) (EVP_MD_size((e)->md))
80 84
81#ifndef NOPROTO
82
83void HMAC_Init(HMAC_CTX *ctx, unsigned char *key, int len,
84 EVP_MD *md);
85void HMAC_Update(HMAC_CTX *ctx,unsigned char *key, int len);
86void HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len);
87void HMAC_cleanup(HMAC_CTX *ctx);
88unsigned char *HMAC(EVP_MD *evp_md, unsigned char *key, int key_len,
89 unsigned char *d, int n, unsigned char *md, unsigned int *md_len);
90 85
86void HMAC_CTX_init(HMAC_CTX *ctx);
87void HMAC_CTX_cleanup(HMAC_CTX *ctx);
91 88
92#else 89#define HMAC_cleanup(ctx) HMAC_CTX_cleanup(ctx) /* deprecated */
93 90
94void HMAC_Init(); 91void HMAC_Init(HMAC_CTX *ctx, const void *key, int len,
95void HMAC_Update(); 92 const EVP_MD *md); /* deprecated */
96void HMAC_Final(); 93void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,
97void HMAC_cleanup(); 94 const EVP_MD *md, ENGINE *impl);
98unsigned char *HMAC(); 95void HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, int len);
96void HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len);
97unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,
98 const unsigned char *d, int n, unsigned char *md,
99 unsigned int *md_len);
99 100
100#endif
101 101
102#ifdef __cplusplus 102#ifdef __cplusplus
103} 103}