static int do_connecting(void) { struct key csession_secret; struct key csession_public; struct key tmpkey; unsigned backoff = 1; saw_seq_gap = 0; buffer->rewind(); key_generate(&csession_secret, &csession_public, keyex); make_ini(&csession_public, buffer->peek()); keylist_exchange_list_key(&tmpkey, &server_publics, &csession_secret); auth_start(&cid_authenticator, &tmpkey); while (!exitasap) { send_packet("INI1", cid_timeout * backoff); while (!exitasap) { if (poll_both() == 0) return STATE_DISCONNECTED; if (stdin_ready) read_lines(); if (sock_ready) { if (receive_cid(&csession_secret)) return STATE_SENDING; backoff = 0; } } if (backoff < retransmits) ++backoff; } return STATE_EXITING; }
static int receive_prf(void) { unsigned offset; struct key* key; if (!receive_packet(PRF1, 8+8+2+2+2+2+2, 8+8+256+256+256+256+256)) return 0; if ((offset = pkt_get_b(&rpacket, 8, &tmpstr, sizeof nonce)) == 0 || memcmp(tmpstr.s, nonce, sizeof nonce) != 0 || (offset = pkt_get_s1(&rpacket, offset, &tmpstr)) == 0 || strcasecmp(tmpstr.s, AUTHENTICATOR_NAME) != 0 || (offset = pkt_get_s1(&rpacket, offset, &keyex_name)) == 0 || (keyex = key_cb_lookup(keyex_name.s)) == 0 || (offset = pkt_get_s1(&rpacket, offset, &tmpstr)) == 0 || strcasecmp(tmpstr.s, KEYHASH_NAME) != 0 || (offset = pkt_get_s1(&rpacket, offset, &tmpstr)) == 0 || strcasecmp(tmpstr.s, ENCRYPTOR_NAME) != 0 || (offset = pkt_get_s1(&rpacket, offset, &tmpstr)) == 0 || strcasecmp(tmpstr.s, "null") != 0 || offset != rpacket.len) REJECT1("Received PRF1 had invalid format or parameters"); if ((keyex = key_cb_lookup(keyex_name.s)) == 0) REJECTf("{PRF response contained bad keyex name: }s", keyex_name.s); if ((key = keylist_get(&shared_secrets, keyex)) == 0) REJECTf("{PRF response referenced missing shared secret: }s", keyex_name.s); debug1(DEBUG_PACKET, "Received PRF packet"); auth_start(&ini_authenticator, key); return 1; }
TI_STATUS mlme_smStartIdle(mlme_t *pMlme) { TI_STATUS status; status = auth_start(pMlme->hAuth); return status; }
/** * * mlme_reportAuthStatus - Set a specific parameter to the MLME SM * * \b Description: * * Set a specific parameter to the MLME SM. * * \b ARGS: * * I - hMlme - MLME SM context \n * I/O - pParam - Parameter \n * * \b RETURNS: * * TI_OK if successful, TI_NOK otherwise. * * \sa mlme_Start, mlme_Stop */ TI_STATUS mlme_reportAuthStatus(TI_HANDLE hMlme, TI_UINT16 status) { mlme_t *pHandle; paramInfo_t param; TI_STATUS fStatus; pHandle = (mlme_t*)hMlme; if (pHandle == NULL) return TI_NOK; if (pHandle->legacyAuthType == AUTH_LEGACY_NONE) return TI_NOK; pHandle->mlmeData.uStatusCode = status; /* If status is successful */ if (status == 0) { /* Mark a successful status - used for conn.c */ pHandle->mlmeData.mgmtStatus = STATUS_SUCCESSFUL; fStatus = mlme_smEvent(&pHandle->currentState, MLME_SM_EVENT_AUTH_SUCCESS, pHandle); } else { /* Now, if the MLME legacy auth type is AUTO_SWITCH, and the Auth legacy auth type is shared key, we configure the auth SM to open system, otherwise, this is really an authentication failure. */ param.paramType = AUTH_LEGACY_TYPE_PARAM; auth_getParam(pHandle->hAuth, ¶m); if ((pHandle->legacyAuthType == AUTH_LEGACY_AUTO_SWITCH) && (param.content.authLegacyAuthType == AUTH_LEGACY_SHARED_KEY)) { param.content.authLegacyAuthType = AUTH_LEGACY_OPEN_SYSTEM; fStatus = auth_setParam(pHandle->hAuth, ¶m); fStatus = auth_start(pHandle->hAuth); } else { pHandle->mlmeData.mgmtStatus = STATUS_AUTH_REJECT; fStatus = mlme_smEvent(&pHandle->currentState, MLME_SM_EVENT_AUTH_FAIL, pHandle); } } return fStatus; }
static int receive_cid(struct key* csession_secret) { struct key ssession_public; struct key tmpkey; if (!receive_packet(CID1, 8 + keyex->size + AUTH_LENGTH, 8 + keyex->size + AUTH_LENGTH)) return 0; if (!pkt_validate(&rpacket, &cid_authenticator)) { debug1(DEBUG_PACKET, "Received CID failed validation"); return 0; } pkt_get_key(&rpacket, 8, &ssession_public, keyex); key_exchange(&tmpkey, &ssession_public, csession_secret); auth_start(&msg_authenticator, &tmpkey); encr_init(&encryptor, &tmpkey); debug1(DEBUG_PACKET, "Received CID packet"); seq_last = 0; return 1; }