Navigation


Changeset 610:a137913d9f88 in freeDiameter


Ignore:
Timestamp:
Dec 1, 2010, 6:19:54 PM (13 years ago)
Author:
Sebastien Decugis <sdecugis@nict.go.jp>
Branch:
default
Phase:
public
Message:

Added ability to extract the Extended MSK (EMSK) for future use

Location:
extensions/app_diameap
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • extensions/app_diameap/diameap_eap.c

    r438 r610  
    444444                        {
    445445                                /*diameap_ba_PolicyUpdate();*/
    446                                 eap_i->aaaEapKeyLength = 0;
     446                                eap_i->aaaEapMSKLength = 0;
     447                                eap_i->aaaEapEMSKLength = 0;
    447448                                if (eap_sm->selectedMethod->eap_method_getKey)
    448449                                {
    449450                                        if ((*eap_sm->selectedMethod->eap_method_getKey)(eap_sm,
    450                                                         &eap_i->aaaEapKeyData, &eap_i->aaaEapKeyLength))
     451                                                        &eap_i->aaaEapMSKData, &eap_i->aaaEapMSKLength,
     452                                                        &eap_i->aaaEapEMSKData, &eap_i->aaaEapEMSKLength))
    451453                                        {
    452454                                                TRACE_DEBUG(INFO,"%s[EAP Protocol] Generating EAP Master Key failed.",DIAMEAP_EXTENSION,eap_sm->selectedMethod->methodname)
    453                                                 eap_i->aaaEapKeyLength = 0;
     455                                                eap_i->aaaEapMSKLength = 0;
     456                                                eap_i->aaaEapEMSKLength = 0;
    454457                                                eap_i->aaaEapKeyAvailable = FALSE;
    455458                                        }
     
    556559                                CHECK_FCT(diameap_eap_new(EAP_SUCCESS, (u8) eap_sm->currentId, TYPE_NONE, NULL, 0,&eap_i->aaaEapReqData))
    557560                                ;
    558                                 if (eap_i->aaaEapKeyData != NULL)
     561                                if (eap_i->aaaEapMSKData != NULL)
    559562                                {
    560563                                        TRACE_DEBUG(FULL+1,"%s[EAP Protocol] EAP Key available [User: %s].",DIAMEAP_EXTENSION,eap_sm->user.userid);
  • extensions/app_diameap/diameap_eap.h

    r438 r610  
    5959        boolean aaaFail;
    6060        struct eap_packet aaaEapReqData;
    61         u8 *aaaEapKeyData;
    62         int aaaEapKeyLength;
     61        u8 *aaaEapMSKData;
     62        int aaaEapMSKLength;
     63        u8 *aaaEapEMSKData;
     64        int aaaEapEMSKLength;
    6365        boolean aaaEapKeyAvailable;
    6466        int aaaMethodTimeout;
  • extensions/app_diameap/diameap_plugins.c

    r425 r610  
    329329                {
    330330                        plugin->eap_method_getKey = (int(*)(struct eap_state_machine *,
    331                                         u8**, int*)) dlsym(plugin->handler, registerplugin->getKey);
     331                                        u8**, int*,u8**, int*)) dlsym(plugin->handler, registerplugin->getKey);
    332332                        if (plugin->eap_method_getKey == NULL)
    333333                        {
  • extensions/app_diameap/diameap_server.c

    r577 r610  
    309309        eap_i->aaaFail = FALSE;
    310310        eap_i->aaaEapReqData.data = NULL;
    311         eap_i->aaaEapKeyData = NULL;
     311        eap_i->aaaEapMSKData = NULL;
     312        eap_i->aaaEapEMSKData = NULL;
    312313        eap_i->aaaEapKeyAvailable = FALSE;
    313314        eap_i->aaaMethodTimeout = 0;
     
    29572958        {
    29582959                CHECK_FCT(fd_msg_avp_new(dataobj_eap_master_session_key, 0, &avp));
    2959                 avp_val.os.data = eap_i.aaaEapKeyData;
    2960                 avp_val.os.len = eap_i.aaaEapKeyLength;
     2960                avp_val.os.data = eap_i.aaaEapMSKData;
     2961                avp_val.os.len = eap_i.aaaEapMSKLength;
    29612962                CHECK_FCT(fd_msg_avp_setvalue(avp, &avp_val));
    29622963                CHECK_FCT( fd_msg_avp_add( ans, MSG_BRW_LAST_CHILD, avp ) );
  • extensions/app_diameap/libdiameap.h

    r425 r610  
    114114                        struct eap_packet eapRespData); /* address of the eap_method_process method */
    115115        boolean (*eap_method_isDone)(struct eap_state_machine *smd); /* address of the eap_method_isDone method */
    116         int (*eap_method_getKey)(struct eap_state_machine *smd, u8 ** key,int *keylength); /* address of the eap_method_getKey method */
     116        int (*eap_method_getKey)(struct eap_state_machine *smd, u8 ** msk,int *msklength,
     117                        u8 ** emsk,int *emsklength); /* address of the eap_method_getKey method */
    117118        void (*eap_method_unregister)(void); /* (Optional) address of the eap_method_unregister method */
    118119        void (*eap_method_free)(void *); /* (Optional) address of the eap_method_datafree method */
  • extensions/app_diameap/plugins/eap_tls/eap_tls.c

    r577 r610  
    5050                struct eap_packet eapRespData);
    5151boolean eap_tls_isDone(struct eap_state_machine *smd);
    52 int eap_tls_getKey(struct eap_state_machine *smd, u8** key, int * keylen);
     52int eap_tls_getKey(struct eap_state_machine *smd, u8** msk, int * msklen, u8** emsk, int * emsklen);
    5353void eap_tls_unregister(void);
    5454void eap_tls_free(void * data);
     
    289289}
    290290
    291 int eap_tls_getKey(struct eap_state_machine *smd, u8 ** key, int *keylen)
     291int eap_tls_getKey(struct eap_state_machine *smd, u8 ** msk, int *msklen, u8 ** emsk, int *emsklen)
    292292{
    293293        struct tls_data * data;
     294        int len = emsk ? 128 : 64;
    294295        data = (struct tls_data *) smd->methodData;
    295         *key = malloc(64);
     296        *msk = malloc(len);
    296297        if (gnutls_prf(data->session, strlen("client EAP encryption"),
    297                         "client EAP encryption", 0, 0, NULL, 64, (char *) *key)
     298                        "client EAP encryption", 0, 0, NULL, len, (char *) *msk)
    298299                        != GNUTLS_E_SUCCESS)
    299300        {
    300                 free(*key);
    301                 *key = NULL;
    302                 *keylen = 0;
     301                free(*msk);
     302                *msk = NULL;
     303                *msklen = 0;
    303304                return 1;
    304305        }
    305306        else
    306307        {
    307                 *keylen = 64;
     308                *msklen = 64;
     309        }
     310        if (emsk) {
     311                *emsk = malloc(64);
     312                memcpy(*emsk, (*msk)+64, 64);
     313                memset((*msk)+64, 0, 64);
     314                *emsklen = 64;
    308315        }
    309316
Note: See TracChangeset for help on using the changeset viewer.