Beispiel #1
0
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;
}
Beispiel #2
0
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, &param);

		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, &param);
			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;
}
Beispiel #5
0
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;
}