1/* hashlen.c: The opiehashlen() library function.
2
3%%% copyright-cmetz-96
4This software is Copyright 1996-2001 by Craig Metz, All Rights Reserved.
5The Inner Net License Version 3 applies to this software.
6You should have received a copy of the license with this software. If
7you didn't get a copy, you may request one from <license@inner.net>.
8
9        History:
10
11	Modified by cmetz for OPIE 2.4. Use struct opie_otpkey, isolate variables.
12	Created by cmetz for OPIE 2.3.
13
14$FreeBSD$
15*/
16
17#include <sys/endian.h>
18
19#include "opie_cfg.h"
20#include "opie.h"
21
22#include <sha.h>
23#include <md4.h>
24#include <md5.h>
25
26VOIDRET opiehashlen FUNCTION((algorithm, in, out, n), int algorithm AND
27VOIDPTR in AND struct opie_otpkey *out AND int n)
28{
29  UINT4 *results = (UINT4 *)out;
30  UINT4 mdx_tmp[4];
31
32  switch(algorithm) {
33    case 3: {
34      SHA_CTX sha;
35      UINT4 digest[5];
36      SHA1_Init(&sha);
37      SHA1_Update(&sha, (unsigned char *)in, n);
38      SHA1_Final((unsigned char *)digest, &sha);
39      results[0] = digest[0] ^ digest[2] ^ digest[4];
40      results[1] = digest[1] ^ digest[3];
41
42      /*
43       * RFC2289 mandates that we convert SHA1 digest from big-endian to little
44       * see Appendix A.
45       */
46      results[0] = bswap32(results[0]);
47      results[1] = bswap32(results[1]);
48      break;
49    }
50    case 4: {
51      MD4_CTX mdx;
52      MD4Init(&mdx);
53      MD4Update(&mdx, (unsigned char *)in, n);
54      MD4Final((unsigned char *)mdx_tmp, &mdx);
55      results[0] = mdx_tmp[0] ^ mdx_tmp[2];
56      results[1] = mdx_tmp[1] ^ mdx_tmp[3];
57      break;
58    }
59    case 5: {
60      MD5_CTX mdx;
61      MD5Init(&mdx);
62      MD5Update(&mdx, (unsigned char *)in, n);
63      MD5Final((unsigned char *)mdx_tmp, &mdx);
64      results[0] = mdx_tmp[0] ^ mdx_tmp[2];
65      results[1] = mdx_tmp[1] ^ mdx_tmp[3];
66      break;
67    }
68  }
69}
70