LCOV - code coverage report
Current view: top level - src/eap_common - eap_psk_common.c (source / functions) Hit Total Coverage
Test: wpa_supplicant/hostapd combined for hwsim test run 1401264779 Lines: 28 34 82.4 %
Date: 2014-05-28 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /*
       2             :  * EAP server/peer: EAP-PSK shared routines
       3             :  * Copyright (c) 2004-2006, Jouni Malinen <j@w1.fi>
       4             :  *
       5             :  * This software may be distributed under the terms of the BSD license.
       6             :  * See README for more details.
       7             :  */
       8             : 
       9             : #include "includes.h"
      10             : 
      11             : #include "common.h"
      12             : #include "crypto/aes_wrap.h"
      13             : #include "eap_defs.h"
      14             : #include "eap_psk_common.h"
      15             : 
      16             : #define aes_block_size 16
      17             : 
      18             : 
      19          36 : int eap_psk_key_setup(const u8 *psk, u8 *ak, u8 *kdk)
      20             : {
      21          36 :         os_memset(ak, 0, aes_block_size);
      22          36 :         if (aes_128_encrypt_block(psk, ak, ak))
      23           0 :                 return -1;
      24          36 :         os_memcpy(kdk, ak, aes_block_size);
      25          36 :         ak[aes_block_size - 1] ^= 0x01;
      26          36 :         kdk[aes_block_size - 1] ^= 0x02;
      27          72 :         if (aes_128_encrypt_block(psk, ak, ak) ||
      28          36 :             aes_128_encrypt_block(psk, kdk, kdk))
      29           0 :                 return -1;
      30          36 :         return 0;
      31             : }
      32             : 
      33             : 
      34          34 : int eap_psk_derive_keys(const u8 *kdk, const u8 *rand_p, u8 *tek, u8 *msk,
      35             :                         u8 *emsk)
      36             : {
      37             :         u8 hash[aes_block_size];
      38          34 :         u8 counter = 1;
      39             :         int i;
      40             : 
      41          34 :         if (aes_128_encrypt_block(kdk, rand_p, hash))
      42           0 :                 return -1;
      43             : 
      44          34 :         hash[aes_block_size - 1] ^= counter;
      45          34 :         if (aes_128_encrypt_block(kdk, hash, tek))
      46           0 :                 return -1;
      47          34 :         hash[aes_block_size - 1] ^= counter;
      48          34 :         counter++;
      49             : 
      50         170 :         for (i = 0; i < EAP_MSK_LEN / aes_block_size; i++) {
      51         136 :                 hash[aes_block_size - 1] ^= counter;
      52         136 :                 if (aes_128_encrypt_block(kdk, hash, &msk[i * aes_block_size]))
      53           0 :                         return -1;
      54         136 :                 hash[aes_block_size - 1] ^= counter;
      55         136 :                 counter++;
      56             :         }
      57             : 
      58         170 :         for (i = 0; i < EAP_EMSK_LEN / aes_block_size; i++) {
      59         136 :                 hash[aes_block_size - 1] ^= counter;
      60         136 :                 if (aes_128_encrypt_block(kdk, hash,
      61         136 :                                           &emsk[i * aes_block_size]))
      62           0 :                         return -1;
      63         136 :                 hash[aes_block_size - 1] ^= counter;
      64         136 :                 counter++;
      65             :         }
      66             : 
      67          34 :         return 0;
      68             : }

Generated by: LCOV version 1.10