2 ** Copyright 1998 - 1999 Double Precision, Inc.
3 ** See COPYING for distribution information.
12 static const char rcsid
[]="$Id: hmac.c,v 1.4 2006/01/22 03:37:04 mrsam Exp $";
14 struct hmac_hashinfo
*hmac_list
[]= {HMAC_LIST
};
17 const struct hmac_hashinfo
*hh
;
20 unsigned char *kxopad
;
21 unsigned char *kxipad
;
26 static void dohashkey(unsigned char *, void *);
27 static void docalcc(void *, void *);
29 void hmac_hashkey(const struct hmac_hashinfo
*hh
, const char *k
,
30 size_t kl
, unsigned char *kxopad
, unsigned char *kxipad
)
40 (*hh
->hh_allocacontext
)( docalcc
, (void *)&i
);
43 static void dokeycalc(struct hhki
*);
45 static void docalcc(void *c
, void *v
)
47 struct hhki
*i
=(struct hhki
*)v
;
51 if (i
->kl
> i
->hh
->hh_B
)
52 (*i
->hh
->hh_allocaval
)(dohashkey
, (void *)i
);
57 static void dohashkey(unsigned char *keybuf
, void *v
)
59 struct hhki
*i
=(struct hhki
*)v
;
61 (*i
->hh
->hh_init
)(i
->context
);
62 (*i
->hh
->hh_hash
)(i
->context
, i
->k
, i
->kl
);
63 (*i
->hh
->hh_endhash
)(i
->context
, i
->kl
);
64 (*i
->hh
->hh_getdigest
)(i
->context
, keybuf
);
70 static void dokeycalc(struct hhki
*i
)
72 char buf
[64]; /* Random guess :-) */
76 (*i
->hh
->hh_init
)(i
->context
);
78 for (l
=0; l
<i
->hh
->hh_B
; l
++)
80 buf
[n
] = ( l
< i
->kl
? i
->k
[l
]:0) ^ 0x5C;
81 if ( ++n
>= sizeof(buf
))
83 (*i
->hh
->hh_hash
)(i
->context
, buf
, sizeof(buf
));
88 (*i
->hh
->hh_hash
)(i
->context
, buf
, n
);
89 (*i
->hh
->hh_getdigest
)(i
->context
, i
->kxopad
);
91 (*i
->hh
->hh_init
)(i
->context
);
93 for (l
=0; l
<i
->hh
->hh_B
; l
++)
95 buf
[n
] = ( l
< i
->kl
? i
->k
[l
]:0) ^ 0x36;
96 if ( ++n
>= sizeof(buf
))
98 (*i
->hh
->hh_hash
)(i
->context
, buf
, sizeof(buf
));
103 (*i
->hh
->hh_hash
)(i
->context
, buf
, n
);
104 (*i
->hh
->hh_getdigest
)(i
->context
, i
->kxipad
);
108 const struct hmac_hashinfo
*hh
;
111 const unsigned char *kxopad
;
112 const unsigned char *kxipad
;
116 static void docalch(void *, void *);
119 const struct hmac_hashinfo
*hh
,
122 const unsigned char *kxopad
,
123 const unsigned char *kxipad
,
135 (*hh
->hh_allocacontext
)( docalch
, (void *)&o
);
138 static void docalch(void *c
, void *v
)
140 struct hhko
*o
=(struct hhko
*)v
;
142 (o
->hh
->hh_setdigest
)(c
, o
->kxipad
);
143 (o
->hh
->hh_hash
)(c
, o
->t
, o
->tl
);
144 (o
->hh
->hh_endhash
)(c
, o
->tl
+o
->hh
->hh_B
);
145 (o
->hh
->hh_getdigest
)(c
, o
->hash
);
147 (o
->hh
->hh_setdigest
)(c
, o
->kxopad
);
148 (o
->hh
->hh_hash
)(c
, o
->hash
, o
->hh
->hh_L
);
149 (o
->hh
->hh_endhash
)(c
, o
->hh
->hh_L
+ o
->hh
->hh_B
);
150 (o
->hh
->hh_getdigest
)(c
, o
->hash
);