2 * WPA Supplicant / EAP-PSK shared routines
3 * Copyright (c) 2004-2005, Jouni Malinen <jkmaline@cc.hut.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.
21 #include "eap_psk_common.h"
23 #define aes_block_size 16
26 void eap_psk_key_setup(const u8
*psk
, u8
*ak
, u8
*kdk
)
28 memset(ak
, 0, aes_block_size
);
29 aes_128_encrypt_block(psk
, ak
, ak
);
30 memcpy(kdk
, ak
, aes_block_size
);
31 ak
[aes_block_size
- 1] ^= 0x01;
32 kdk
[aes_block_size
- 1] ^= 0x02;
33 aes_128_encrypt_block(psk
, ak
, ak
);
34 aes_128_encrypt_block(psk
, kdk
, kdk
);
38 void eap_psk_derive_keys(const u8
*kdk
, const u8
*rand_p
, u8
*tek
, u8
*msk
)
40 u8 hash
[aes_block_size
];
44 aes_128_encrypt_block(kdk
, rand_p
, hash
);
46 hash
[aes_block_size
- 1] ^= counter
;
47 aes_128_encrypt_block(kdk
, hash
, tek
);
48 hash
[aes_block_size
- 1] ^= counter
;
51 for (i
= 0; i
< EAP_PSK_MSK_LEN
/ aes_block_size
; i
++) {
52 hash
[aes_block_size
- 1] ^= counter
;
53 aes_128_encrypt_block(kdk
, hash
, &msk
[i
* aes_block_size
]);
54 hash
[aes_block_size
- 1] ^= counter
;