sm_handler.c

来自「可以用作很多客户端的XSUPPLICANT的源代码。比如用在802.1x或者无线」· C语言 代码 · 共 695 行 · 第 1/2 页

C
695
字号
  if ((!challenge) || (!response) || (!ckey))    {      debug_printf(DEBUG_NORMAL, "Invalid data passed to do_gsm()!\n");      return XEMALLOC;    }  strcpy(buff2, RUN_GSM);  bzero(&buff3, MAXBUFF);  for (i = 0; i < 16; i++)    {      sprintf(buff3,"%02X",challenge[i]);      strcat(buff2, buff3);    }  //  printf("(in do_gsm) Sending in : %s\n",buff2);  len = MAXBUFF;  card_io(buff2, buf, &len);  /*printf("Response : ");    for (i=0; i<4; i++)    printf("%02X ",buf[i]);  */  memcpy(response, &buf[0], 4);  /*  printf("\nCipher Key : ");  for (i=4; i<12; i++)    printf("%02X ",buf[i]);  */  memcpy(ckey, &buf[4], 8);  //  printf("\n");  return 0;}int sc_need_init(){  return need_init;}int init_get_imsi(struct generic_eap_data *thisint, char *rimsi){  LPSTR mszReaders;  long ret;  DWORD size, dwState, dwProtocol, dwAtrLen;  DWORD len;  unsigned char *buf;   unsigned char buff2[MAXBUFF], buff3[MAXBUFF];  unsigned char imsi[20];  int i;  char *s, *dbuf, *pin;  BYTE pbAtr[MAX_ATR_SIZE];  struct config_eap_sim *mydata;  if ((!thisint) || (!thisint->eap_conf_data))    {      debug_printf(DEBUG_NORMAL, "Invalid data passed to init_get_imsi()!\n");      return XEMALLOC;    }  mydata = (struct config_eap_sim *)thisint->eap_conf_data;  if (need_init == 0) return 0;  buf = (unsigned char *)malloc(MAXBUFF);  if (buf == NULL) return XEMALLOC;  g_sc_context = 0;  g_card_hdl = 0;  o_stdprotocol = 0;  pin = mydata->password;  // First, get a context for us to work with the card.  ret = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &g_sc_context);  if (ret != SCARD_S_SUCCESS)    {      printf("Error!  Couldn't establish Smart Card Context!  (Is pcscd loaded?)\n");      free(buf);      buf = NULL;      return -1;    }  // Find out the size of the buffer that we need in order to get our  // reader information back.  ret = SCardListReaders(g_sc_context, NULL, NULL, &readerstrlen);  if (ret != SCARD_S_SUCCESS)    {      print_sc_error(ret);      free(buf);      buf = NULL;      return -1;    }  o_readername = (char *)malloc(readerstrlen);  if (o_readername == NULL)    {      printf("Couldn't allocate memory for reader info string!\n");    }  ret = SCardListReaders(g_sc_context, NULL, o_readername, &readerstrlen);  if (ret != SCARD_S_SUCCESS)    {      printf("Couldn't list smart card readers!\n");      print_sc_error(ret);      free(buf);      buf = NULL;      return -1;    }  // We may have found more than one reader, but we are only going to use   // the first one we found.  This could be changed in the future if a  // situation presents itself that needs more than one reader.  In that  // case, the string that is returned contains the names of all of the readers  // with the last name being terminated with a double NULL. \0\0.  debug_printf(DEBUG_AUTHTYPES, "Found reader : %s\n",o_readername);  while (1)    {      ret = SCardConnect(g_sc_context, o_readername,			 SCARD_SHARE_SHARED,			 SCARD_PROTOCOL_T0, 			 &g_card_hdl, &o_stdprotocol);            if (ret == SCARD_S_SUCCESS) break;      if (ret == SCARD_E_NO_SMARTCARD)	{	  printf("Please insert a smart card!\n");	  sleep(2);	  continue;	} else {	  printf("An unchecked error happened!\n");	  print_sc_error(ret);	  break;	}    }  dwState = 0;  dwProtocol = 0;  dwAtrLen = MAX_ATR_SIZE;  size = 50;  mszReaders= (LPSTR) malloc(size);  bzero(mszReaders, 50);  bzero(&pbAtr, MAX_ATR_SIZE);  ret = SCardStatus(g_card_hdl, mszReaders, &size, &dwState, &dwProtocol, pbAtr, &dwAtrLen);  if (ret != SCARD_S_SUCCESS)    {      print_sc_error(ret);      free(mszReaders);      free(buf);      buf = NULL;      exit(1);                /* Need to fix this! */    }  switch (dwState)    {    case SCARD_ABSENT:      debug_printf(DEBUG_NORMAL, "There is no card in the reader.\n");      break;    case SCARD_PRESENT:      debug_printf(DEBUG_NORMAL, "The card needs to be moved to a position that the reader can use!\n");      break;    case SCARD_SWALLOWED:      debug_printf(DEBUG_NORMAL, "Card is ready, but not powered.\n");      break;    case SCARD_POWERED:      debug_printf(DEBUG_NORMAL, "Card is powered, but we aren't sure of the mode of the card!\n");      break;    }  /* select the Master File */                  len=MAXBUFF;  card_io(SELECT_MF, buf, &len);  /* select DF_GSM */  len=MAXBUFF;  card_io(SELECT_DF_GSM, buf, &len);   if (!(buf[13] & 0x80))    {      if (pin == NULL) return -1;   /* We don't have a pin, but we need one. */      strcpy(buff2, "A020000108");      for (i = 0;i<strlen(pin); i++)	{	  sprintf(buff3, "%02X",pin[i]);	  strcat(buff2, buff3);	}      for (i = strlen(pin); i < 8; i++)	{	  strcat(buff2, "FF");             /* Pad it to 8 bytes */	}      len=MAXBUFF;      card_io(buff2, buf, &len);      if (len == 2 && buf[0] == 0x98)	{	  if (buf[1] == 0x04)	    {	      printf("Incorrect PIN, at least one attempt left\n");	      exit (1);               /* Need to fix this! */	    }	  else if (buf[1] == 0x40)	    {	      printf("Incorrect PIN, no attempts left\n");	      exit (1);               /* Need to fix this! */	    }	}    }  len=MAXBUFF;  dbuf = (char *)malloc(MAXBUFF);  card_io(SELECT_EF_IMSI,dbuf,&len);  len=MAXBUFF;  bzero(dbuf,MAXBUFF);  card_io(GET_IMSI,dbuf,&len);    s = imsi;  *s++ = hinibble(dbuf[1]);    for (i = 2; i<9; i++)    {      *s++ = lonibble(dbuf[i]);      *s++ = hinibble(dbuf[i]);    }  *s = '\0';  if (rimsi != NULL)    {      memcpy(rimsi, imsi, 18);    }    free(buf);  buf = NULL;  free(dbuf);  dbuf = NULL;  free(mszReaders);  mszReaders = NULL;  return XENONE;}int eapsim_get_username(struct interface_data *thisint){  char imsi[18];   // An IMSI should always be 18 digits.  char realm[25];  char *username;  struct config_eap_sim *userdata;  struct generic_eap_data mydata;  if ((!thisint) || (!thisint->userdata) || (!thisint->userdata->methods) ||      (!thisint->userdata->methods->method_data))    {      debug_printf(DEBUG_NORMAL, "Invalid interface structure passed to eapsim_get_username()!\n");      return XEMALLOC;    }  userdata = (struct config_eap_sim *)thisint->userdata->methods->method_data;  mydata.eap_conf_data = userdata;  bzero(&imsi, 18);  init_get_imsi(&mydata, (char *)&imsi);  debug_printf(DEBUG_AUTHTYPES, "SIM IMSI : %s\n",imsi);  if (thisint->userdata->identity != NULL)    {      free(thisint->userdata->identity);    }  thisint->userdata->identity = (char *)malloc(50);  // 50 should be plenty!  if (thisint->userdata->identity == NULL) return XEMALLOC;  username = thisint->userdata->identity;  userdata->username = username;  bzero(username, 50);  username[0] = '1';  // An IMSI should always start with a 1.  strncpy(&username[1], (char *)&imsi, 18);  if (userdata->auto_realm == TRUE)    {      bzero(&realm, 25);      sprintf((char *)&realm, "@mnc%c%c%c.mcc%c%c%c.owlan.org",	      username[4], username[5], username[6], username[1], username[2],	      username[3]);      debug_printf(DEBUG_AUTHTYPES, "Realm Portion : %s\n",realm);      strcat(username, realm);    }  // Close the smartcard, so that we know what state we are in.  close_smartcard();  debug_printf(DEBUG_AUTHTYPES, "Username is now : %s\n", username);  return XENONE;}int init_smartcard(struct generic_eap_data *thisint){  if (!thisint)    {      debug_printf(DEBUG_NORMAL, "Invalid interface structure passed to init_smartcard()!\n");      return XEMALLOC;    }  init_get_imsi(thisint, NULL);  return XENONE;}int close_smartcard(){  long ret;  if (g_card_hdl)     {      ret = SCardDisconnect(g_card_hdl, SCARD_UNPOWER_CARD);      if (ret != SCARD_S_SUCCESS) 	debug_printf(DEBUG_NORMAL, "Couldn't disconnect from Smart Card!\n");      g_card_hdl = 0;    }  if (g_sc_context)    {      ret = SCardReleaseContext(g_sc_context);      if (ret != SCARD_S_SUCCESS) 	debug_printf(DEBUG_NORMAL, "Couldn't release smart card context!\n");      g_sc_context = 0;    }  return XENONE;}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?