eap_server_vendor_test.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. * hostapd / Test method for vendor specific (expanded) EAP type
  3. * Copyright (c) 2005-2007, 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. #include "includes.h"
  9. #include "common.h"
  10. #include "eap_i.h"
  11. #define EAP_VENDOR_ID EAP_VENDOR_HOSTAP
  12. #define EAP_VENDOR_TYPE 0xfcfbfaf9
  13. struct eap_vendor_test_data {
  14. enum { INIT, CONFIRM, SUCCESS, FAILURE } state;
  15. };
  16. static const char * eap_vendor_test_state_txt(int state)
  17. {
  18. switch (state) {
  19. case INIT:
  20. return "INIT";
  21. case CONFIRM:
  22. return "CONFIRM";
  23. case SUCCESS:
  24. return "SUCCESS";
  25. case FAILURE:
  26. return "FAILURE";
  27. default:
  28. return "?";
  29. }
  30. }
  31. static void eap_vendor_test_state(struct eap_vendor_test_data *data,
  32. int state)
  33. {
  34. wpa_printf(MSG_DEBUG, "EAP-VENDOR-TEST: %s -> %s",
  35. eap_vendor_test_state_txt(data->state),
  36. eap_vendor_test_state_txt(state));
  37. data->state = state;
  38. }
  39. static void * eap_vendor_test_init(struct eap_sm *sm)
  40. {
  41. struct eap_vendor_test_data *data;
  42. data = os_zalloc(sizeof(*data));
  43. if (data == NULL)
  44. return NULL;
  45. data->state = INIT;
  46. return data;
  47. }
  48. static void eap_vendor_test_reset(struct eap_sm *sm, void *priv)
  49. {
  50. struct eap_vendor_test_data *data = priv;
  51. os_free(data);
  52. }
  53. static struct wpabuf * eap_vendor_test_buildReq(struct eap_sm *sm, void *priv,
  54. u8 id)
  55. {
  56. struct eap_vendor_test_data *data = priv;
  57. struct wpabuf *req;
  58. req = eap_msg_alloc(EAP_VENDOR_ID, EAP_VENDOR_TYPE, 1,
  59. EAP_CODE_REQUEST, id);
  60. if (req == NULL) {
  61. wpa_printf(MSG_ERROR, "EAP-VENDOR-TEST: Failed to allocate "
  62. "memory for request");
  63. return NULL;
  64. }
  65. wpabuf_put_u8(req, data->state == INIT ? 1 : 3);
  66. return req;
  67. }
  68. static Boolean eap_vendor_test_check(struct eap_sm *sm, void *priv,
  69. struct wpabuf *respData)
  70. {
  71. const u8 *pos;
  72. size_t len;
  73. pos = eap_hdr_validate(EAP_VENDOR_ID, EAP_VENDOR_TYPE, respData, &len);
  74. if (pos == NULL || len < 1) {
  75. wpa_printf(MSG_INFO, "EAP-VENDOR-TEST: Invalid frame");
  76. return TRUE;
  77. }
  78. return FALSE;
  79. }
  80. static void eap_vendor_test_process(struct eap_sm *sm, void *priv,
  81. struct wpabuf *respData)
  82. {
  83. struct eap_vendor_test_data *data = priv;
  84. const u8 *pos;
  85. size_t len;
  86. pos = eap_hdr_validate(EAP_VENDOR_ID, EAP_VENDOR_TYPE, respData, &len);
  87. if (pos == NULL || len < 1)
  88. return;
  89. if (data->state == INIT) {
  90. if (*pos == 2)
  91. eap_vendor_test_state(data, CONFIRM);
  92. else
  93. eap_vendor_test_state(data, FAILURE);
  94. } else if (data->state == CONFIRM) {
  95. if (*pos == 4)
  96. eap_vendor_test_state(data, SUCCESS);
  97. else
  98. eap_vendor_test_state(data, FAILURE);
  99. } else
  100. eap_vendor_test_state(data, FAILURE);
  101. }
  102. static Boolean eap_vendor_test_isDone(struct eap_sm *sm, void *priv)
  103. {
  104. struct eap_vendor_test_data *data = priv;
  105. return data->state == SUCCESS;
  106. }
  107. static u8 * eap_vendor_test_getKey(struct eap_sm *sm, void *priv, size_t *len)
  108. {
  109. struct eap_vendor_test_data *data = priv;
  110. u8 *key;
  111. const int key_len = 64;
  112. if (data->state != SUCCESS)
  113. return NULL;
  114. key = os_malloc(key_len);
  115. if (key == NULL)
  116. return NULL;
  117. os_memset(key, 0x11, key_len / 2);
  118. os_memset(key + key_len / 2, 0x22, key_len / 2);
  119. *len = key_len;
  120. return key;
  121. }
  122. static Boolean eap_vendor_test_isSuccess(struct eap_sm *sm, void *priv)
  123. {
  124. struct eap_vendor_test_data *data = priv;
  125. return data->state == SUCCESS;
  126. }
  127. int eap_server_vendor_test_register(void)
  128. {
  129. struct eap_method *eap;
  130. int ret;
  131. eap = eap_server_method_alloc(EAP_SERVER_METHOD_INTERFACE_VERSION,
  132. EAP_VENDOR_ID, EAP_VENDOR_TYPE,
  133. "VENDOR-TEST");
  134. if (eap == NULL)
  135. return -1;
  136. eap->init = eap_vendor_test_init;
  137. eap->reset = eap_vendor_test_reset;
  138. eap->buildReq = eap_vendor_test_buildReq;
  139. eap->check = eap_vendor_test_check;
  140. eap->process = eap_vendor_test_process;
  141. eap->isDone = eap_vendor_test_isDone;
  142. eap->getKey = eap_vendor_test_getKey;
  143. eap->isSuccess = eap_vendor_test_isSuccess;
  144. ret = eap_server_method_register(eap);
  145. if (ret)
  146. eap_server_method_free(eap);
  147. return ret;
  148. }