huangcm
2024-12-18 9d29be7f7249789d6ffd0440067187a9f040c2cd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
 * FIPS 186-2 PRF for internal crypto implementation
 * Copyright (c) 2006-2007, Jouni Malinen <j@w1.fi>
 *
 * This software may be distributed under the terms of the BSD license.
 * See README for more details.
 */
 
#include "includes.h"
 
#include "common.h"
#include "sha1.h"
#include "sha1_i.h"
#include "crypto.h"
 
 
int fips186_2_prf(const u8 *seed, size_t seed_len, u8 *x, size_t xlen)
{
   u8 xkey[64];
   u32 t[5], _t[5];
   int i, j, m, k;
   u8 *xpos = x;
   u32 carry;
 
   if (seed_len < sizeof(xkey))
       os_memset(xkey + seed_len, 0, sizeof(xkey) - seed_len);
   else
       seed_len = sizeof(xkey);
 
   /* FIPS 186-2 + change notice 1 */
 
   os_memcpy(xkey, seed, seed_len);
   t[0] = 0x67452301;
   t[1] = 0xEFCDAB89;
   t[2] = 0x98BADCFE;
   t[3] = 0x10325476;
   t[4] = 0xC3D2E1F0;
 
   m = xlen / 40;
   for (j = 0; j < m; j++) {
       /* XSEED_j = 0 */
       for (i = 0; i < 2; i++) {
           /* XVAL = (XKEY + XSEED_j) mod 2^b */
 
           /* w_i = G(t, XVAL) */
           os_memcpy(_t, t, 20);
           SHA1Transform(_t, xkey);
           _t[0] = host_to_be32(_t[0]);
           _t[1] = host_to_be32(_t[1]);
           _t[2] = host_to_be32(_t[2]);
           _t[3] = host_to_be32(_t[3]);
           _t[4] = host_to_be32(_t[4]);
           os_memcpy(xpos, _t, 20);
 
           /* XKEY = (1 + XKEY + w_i) mod 2^b */
           carry = 1;
           for (k = 19; k >= 0; k--) {
               carry += xkey[k] + xpos[k];
               xkey[k] = carry & 0xff;
               carry >>= 8;
           }
 
           xpos += SHA1_MAC_LEN;
       }
       /* x_j = w_0|w_1 */
   }
 
   return 0;
}