File: cpyrit/_cpyrit_cpu.c
Function: EAPOLCracker_solve
Error: returning (PyObject*)NULL without setting an exception
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