971 static PyObject*
972 EAPOLCracker_solve(EAPOLCracker *self, PyObject *args)
973 {
974 PyObject *result_seq, *pmkbuffer_obj, *solution_obj;
975 unsigned char *pmkbuffer, *t, kck[4][16], md5mics[4][16], sha1mics[4][20];
976 Py_ssize_t buffersize;
977 int i, j, solution_idx;
978 PyBufferProcs *pb;
979
980 pmkbuffer = NULL;
981
982 if (!PyArg_ParseTuple(args, "O", &result_seq))
when PyArg_ParseTuple() succeeds
taking False path
983 return NULL;
984
985 /* Try to get the PMKs through the object's buffer-protocol (faster) */
986 if (PyObject_HasAttrString(result_seq, "getpmkbuffer"))
when PyObject_HasAttrString() returns 0 (false)
taking False path
987 {
988 pmkbuffer_obj = PyObject_CallMethod(result_seq, "getpmkbuffer", NULL);
989 if (pmkbuffer_obj)
990 {
991 if (!PyBuffer_Check(pmkbuffer_obj))
992 {
993 PyErr_SetString(PyExc_ValueError, "The object's .getpmkbuffer() must provide a buffer-object.");
994 Py_DECREF(pmkbuffer_obj);
995 return NULL;
996 } else {
997 pb = pmkbuffer_obj->ob_type->tp_as_buffer;
998 buffersize = (*pb->bf_getreadbuffer)(pmkbuffer_obj, 0, (void**)&t);
999 if (buffersize % 32 != 0)
1000 {
1001 PyErr_SetString(PyExc_ValueError, "Object's buffer's length is not a multiple of 32.");
1002 Py_DECREF(pmkbuffer_obj);
1003 return NULL;
1004 }
1005 /* Align size to 4*32 for SSE2 */
1006 pmkbuffer = PyMem_Malloc(buffersize + 128 - (buffersize % 128));
1007 if (!pmkbuffer)
1008 {
1009 PyErr_NoMemory();
1010 Py_DECREF(pmkbuffer_obj);
1011 return NULL;
1012 }
1013 memcpy(pmkbuffer, t, buffersize);
1014 Py_DECREF(pmkbuffer_obj);
1015 }
1016 } else {
1017 /* Pass the error from getpmkbuffer() */
1018 return NULL;
1019 }
1020 } else {
1021 /* Basic sequence-like objects must be unpacked */
1022 buffersize = EAPOLCracker_unpack(result_seq, &pmkbuffer);
1023 if (!pmkbuffer)
when treating unknown unsigned char * * from cpyrit/_cpyrit_cpu.c:1022 as NULL
taking True path
1024 return NULL;
1025 }
1026
1027 solution_idx = -1;
1028 Py_BEGIN_ALLOW_THREADS;
1029 for (i = 0; i < buffersize / 32 && solution_idx == -1; i += 4)
1030 {
1031 fourwise_sha1hmac(self->pke, 100, &pmkbuffer[i*32], 32, (unsigned char*)&sha1mics);
1032 for (j = 0; j < 4; j++)
1033 memcpy(kck[j], sha1mics[j], 16);
1034 if (self->keyscheme == HMAC_MD5_RC4)
1035 {
1036 fourwise_md5hmac(self->eapolframe, self->eapolframe_size, (unsigned char*)&kck, 16, (unsigned char*)&md5mics);
1037 for (j = 0; j < 4 && i + j < buffersize / 32; j++)
1038 if (memcmp(&md5mics[j], self->keymic, 16) == 0)
1039 {
1040 solution_idx = i + j;
1041 break;
1042 }
1043 } else
1044 {
1045 fourwise_sha1hmac(self->eapolframe, self->eapolframe_size, (unsigned char*)&kck, 16, (unsigned char*)&sha1mics);
1046 for (j = 0; j < 4 && i + j < buffersize / 32; j++)
1047 if (memcmp(&sha1mics[j], self->keymic, 16) == 0)
1048 {
1049 solution_idx = i + j;
1050 break;
1051 }
1052 }
1053 }
1054 Py_END_ALLOW_THREADS;
1055
1056 PyMem_Free(pmkbuffer);
1057
1058 if (solution_idx == -1)
1059 {
1060 solution_obj = Py_None;
1061 Py_INCREF(solution_obj);
1062 } else {
1063 solution_obj = PySequence_GetItem(result_seq, solution_idx);
1064 }
1065
1066 return solution_obj;
1067 }
returning (PyObject*)NULL without setting an exception