Branch data Line data Source code
1 : : /* hmac-sha1.c -- hashed message authentication codes
2 : : Copyright (C) 2005-2006, 2009-2012 Free Software Foundation, Inc.
3 : :
4 : : This program is free software; you can redistribute it and/or modify
5 : : it under the terms of the GNU Lesser General Public License as published by
6 : : the Free Software Foundation; either version 2.1, or (at your option)
7 : : any later version.
8 : :
9 : : This program is distributed in the hope that it will be useful,
10 : : but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : : GNU Lesser General Public License for more details.
13 : :
14 : : You should have received a copy of the GNU Lesser General Public License
15 : : along with this program; if not, see <http://www.gnu.org/licenses/>. */
16 : :
17 : : /* Written by Simon Josefsson. */
18 : :
19 : : #include <config.h>
20 : :
21 : : #include "hmac.h"
22 : :
23 : : #include "memxor.h"
24 : : #include "sha1.h"
25 : :
26 : : #include <string.h>
27 : :
28 : : #define IPAD 0x36
29 : : #define OPAD 0x5c
30 : :
31 : : int
32 : 3 : hmac_sha1 (const void *key, size_t keylen,
33 : : const void *in, size_t inlen, void *resbuf)
34 : : {
35 : : struct sha1_ctx inner;
36 : : struct sha1_ctx outer;
37 : : char optkeybuf[20];
38 : : char block[64];
39 : : char innerhash[20];
40 : :
41 : : /* Reduce the key's size, so that it becomes <= 64 bytes large. */
42 : :
43 [ - + ]: 3 : if (keylen > 64)
44 : : {
45 : : struct sha1_ctx keyhash;
46 : :
47 : 0 : sha1_init_ctx (&keyhash);
48 : 0 : sha1_process_bytes (key, keylen, &keyhash);
49 : 0 : sha1_finish_ctx (&keyhash, optkeybuf);
50 : :
51 : 0 : key = optkeybuf;
52 : 0 : keylen = 20;
53 : : }
54 : :
55 : : /* Compute INNERHASH from KEY and IN. */
56 : :
57 : 3 : sha1_init_ctx (&inner);
58 : :
59 : 3 : memset (block, IPAD, sizeof (block));
60 : 3 : memxor (block, key, keylen);
61 : :
62 : 3 : sha1_process_block (block, 64, &inner);
63 : 3 : sha1_process_bytes (in, inlen, &inner);
64 : :
65 : 3 : sha1_finish_ctx (&inner, innerhash);
66 : :
67 : : /* Compute result from KEY and INNERHASH. */
68 : :
69 : 3 : sha1_init_ctx (&outer);
70 : :
71 : 3 : memset (block, OPAD, sizeof (block));
72 : 3 : memxor (block, key, keylen);
73 : :
74 : 3 : sha1_process_block (block, 64, &outer);
75 : 3 : sha1_process_bytes (innerhash, 20, &outer);
76 : :
77 : 3 : sha1_finish_ctx (&outer, resbuf);
78 : :
79 : 3 : return 0;
80 : : }
|