2 * EAP server/peer: EAP-PSK shared routines
3 * Copyright (c) 2004-2006, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
20 #include "eap_psk_common.h"
22 #define aes_block_size 16
25 int eap_psk_key_setup(const u8
*psk
, u8
*ak
, u8
*kdk
)
27 os_memset(ak
, 0, aes_block_size
);
28 if (aes_128_encrypt_block(psk
, ak
, ak
))
30 os_memcpy(kdk
, ak
, aes_block_size
);
31 ak
[aes_block_size
- 1] ^= 0x01;
32 kdk
[aes_block_size
- 1] ^= 0x02;
33 if (aes_128_encrypt_block(psk
, ak
, ak
) ||
34 aes_128_encrypt_block(psk
, kdk
, kdk
))
40 int eap_psk_derive_keys(const u8
*kdk
, const u8
*rand_p
, u8
*tek
, u8
*msk
,
43 u8 hash
[aes_block_size
];
47 if (aes_128_encrypt_block(kdk
, rand_p
, hash
))
50 hash
[aes_block_size
- 1] ^= counter
;
51 if (aes_128_encrypt_block(kdk
, hash
, tek
))
53 hash
[aes_block_size
- 1] ^= counter
;
56 for (i
= 0; i
< EAP_MSK_LEN
/ aes_block_size
; i
++) {
57 hash
[aes_block_size
- 1] ^= counter
;
58 if (aes_128_encrypt_block(kdk
, hash
, &msk
[i
* aes_block_size
]))
60 hash
[aes_block_size
- 1] ^= counter
;
64 for (i
= 0; i
< EAP_EMSK_LEN
/ aes_block_size
; i
++) {
65 hash
[aes_block_size
- 1] ^= counter
;
66 if (aes_128_encrypt_block(kdk
, hash
,
67 &emsk
[i
* aes_block_size
]))
69 hash
[aes_block_size
- 1] ^= counter
;