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 void eap_psk_key_setup(const u8
*psk
, u8
*ak
, u8
*kdk
)
27 os_memset(ak
, 0, aes_block_size
);
28 aes_128_encrypt_block(psk
, ak
, ak
);
29 os_memcpy(kdk
, ak
, aes_block_size
);
30 ak
[aes_block_size
- 1] ^= 0x01;
31 kdk
[aes_block_size
- 1] ^= 0x02;
32 aes_128_encrypt_block(psk
, ak
, ak
);
33 aes_128_encrypt_block(psk
, kdk
, kdk
);
37 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_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
;
58 for (i
= 0; i
< EAP_EMSK_LEN
/ aes_block_size
; i
++) {
59 hash
[aes_block_size
- 1] ^= counter
;
60 aes_128_encrypt_block(kdk
, hash
, &emsk
[i
* aes_block_size
]);
61 hash
[aes_block_size
- 1] ^= counter
;