bool PSMContentDownloaderParent::RecvOnStopRequest(const nsresult& code) { if (NS_SUCCEEDED(code)) { // See also PSMContentStreamListener::OnStopRequest. In this case, we don't // have to dispatch ImportCertificate off of an event because we don't have // to worry about Necko sending "clean up" events and destroying us if // ImportCertificate spins the event loop. ImportCertificate(); } if (mIPCOpen) { mozilla::unused << Send__delete__(this); } return true; }
CK_RV getcertificates(HWND hTextEdit, CK_FUNCTION_LIST_PTR functions) { // CK_FUNCTION_LIST_PTR functions; CK_RV retval = CKR_OK; CK_SESSION_HANDLE session_handle; long slot_count = 0; CK_SLOT_ID_PTR slotIds; int slotIdx; CK_ULONG ulObjectCount=1; // retval = (functions->C_Initialize) (NULL); // if (retval == CKR_OK) // { retval = (functions->C_GetSlotList) (CK_TRUE, 0, &slot_count); if (retval == CKR_OK) { if(slot_count == 0) { SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)"No eID Card found:\r\n"); } else { SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)"eID card found \r\n"); SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)"Retrieving certificates.. \r\n"); } slotIds = malloc(slot_count * sizeof(CK_SLOT_INFO)); //check failure retval = (functions->C_GetSlotList) (CK_TRUE, slotIds, &slot_count); if (retval == CKR_OK) { for (slotIdx = 0; slotIdx < slot_count; slotIdx++) { CK_SLOT_ID slotId = slotIds[slotIdx]; CK_ULONG ulData = CKO_DATA; CK_ATTRIBUTE serialNrAttr[2] = {{CKA_CLASS,&ulData,sizeof(CK_ULONG)},{CKA_LABEL,"carddata_serialnumber", 21}}; CK_ULONG ulCertificate = CKO_CERTIFICATE; CK_ATTRIBUTE attributes[1] = {CKA_CLASS,&ulCertificate,sizeof(CK_ULONG)}; CK_BYTE label[100]; CK_ULONG ullabelLen = 100; CK_BYTE value[10240]; CK_ULONG ulvalueLen = 10239; CK_BYTE_PTR pbserialNumber = NULL; CK_BYTE_PTR pbcertificateData = NULL; CK_ULONG dwserialNumberLen = 0; CK_ULONG dwcertificateDataLen = 0; CK_ATTRIBUTE attr_label_templ = {CKA_LABEL,(CK_VOID_PTR)label,ullabelLen}; CK_ATTRIBUTE attr_value_templ = {CKA_VALUE,(CK_VOID_PTR)value,ulvalueLen}; CK_OBJECT_HANDLE hKey; retval = (functions->C_OpenSession)(slotId, CKF_SERIAL_SESSION, NULL_PTR, NULL_PTR, &session_handle); if (retval == CKR_OK) { retval = (functions->C_FindObjectsInit)(session_handle, serialNrAttr, 2); if (retval == CKR_OK) { //enable search ulObjectCount = 1; while (ulObjectCount > 0) { retval = (functions->C_FindObjects)(session_handle, &hKey,1,&ulObjectCount); //ReturnedSuccesfull(retval,&trv, "C_FindObjects", "test_getprivatekeys" ); if (ulObjectCount > 0) { attr_value_templ.ulValueLen = 10239; retval = (functions->C_GetAttributeValue)(session_handle,hKey,&attr_value_templ,1); if (retval == CKR_OK) { pbserialNumber = malloc (attr_value_templ.ulValueLen + 1); if (pbserialNumber != NULL) { memcpy(pbserialNumber, attr_value_templ.pValue, attr_value_templ.ulValueLen); pbserialNumber[attr_value_templ.ulValueLen] = 0; dwserialNumberLen = attr_value_templ.ulValueLen; SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)"card serial number read\r\n"); } else { SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)"ERROR: malloc failed\r\n"); } //testlog(LVL_INFO,"key LABEL value = %s\n", pbcertificateData); } } } retval = (functions->C_FindObjectsFinal)(session_handle); //ReturnedSuccesfull(retval,&trv, "C_FindObjectsFinal", "test_getprivatekeys" ); } //in order to start searching ulObjectCount = 1; retval = (functions->C_FindObjectsInit)(session_handle, attributes, 1); if (retval == CKR_OK) { while (ulObjectCount > 0) { retval = (functions->C_FindObjects)(session_handle, &hKey,1,&ulObjectCount); //ReturnedSuccesfull(retval,&trv, "C_FindObjects", "test_getprivatekeys" ); if (ulObjectCount > 0) { attr_label_templ.ulValueLen = 100; retval = (functions->C_GetAttributeValue)(session_handle,hKey,&attr_label_templ,1); if (retval == CKR_OK) { pbcertificateData = attr_label_templ.pValue; pbcertificateData[attr_label_templ.ulValueLen] = 0; SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)"certificate found: "); SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)pbcertificateData); } attr_value_templ.ulValueLen = 10239; retval = (functions->C_GetAttributeValue)(session_handle,hKey,&attr_value_templ,1); if (retval == CKR_OK) { PCCERT_CONTEXT pCertContext = NULL; pbcertificateData = attr_value_templ.pValue; dwcertificateDataLen = attr_value_templ.ulValueLen; if( ImportCertificate(pbserialNumber,dwserialNumberLen,pbcertificateData,dwcertificateDataLen, &pCertContext) == TRUE) { SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)" - registered\r\n"); } else { SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)" - registration failed\r\n"); } if(pCertContext != NULL) CertFreeCertificateContext(pCertContext); //testlog(LVL_INFO,"key LABEL value = %s\n", pbcertificateData); } else { char errormessage[100]; _snprintf(errormessage,100,"C_GetAttributeValue returned 0x%0.8x\r\n",retval); SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)"\r\n"); SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)"ERROR: failed getting attribute value \r\n"); SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)errormessage); } } } retval = (functions->C_FindObjectsFinal)(session_handle); //ReturnedSuccesfull(retval,&trv, "C_FindObjectsFinal", "test_getprivatekeys" ); } } retval = (functions->C_CloseSession) (session_handle); //ReturnedSuccesfull(retval,&trv, "C_CloseSession", "test_getprivatekeys" ); if (pbserialNumber != NULL) free (pbserialNumber); } } } // retval = (functions->C_Finalize) (NULL_PTR); //ReturnedSuccesfull(retval,&trv, "C_Finalize", "test_getprivatekeys" ); // } return retval; }
CK_RV GetAndRegisterCertificates(HWND hTextEdit, CK_FUNCTION_LIST_PTR functions, CK_SESSION_HANDLE *psession_handle, CK_BYTE* pbserialNumber,CK_ULONG ulserialNumberLen, PCCERT_CONTEXT* ppCertContext, CK_ULONG ulcertContextLen) { CK_RV retval = CKR_OK; CK_ULONG ulObjectCount=1; CK_ULONG ulCertificate = CKO_CERTIFICATE; CK_ATTRIBUTE attributes[1] = {CKA_CLASS,&ulCertificate,sizeof(CK_ULONG)}; CK_BYTE label[100]; CK_ULONG ullabelLen = 100; CK_BYTE value[10240]; CK_ULONG ulvalueLen = 10239; CK_BYTE_PTR pbcertificateData = NULL; CK_ULONG dwcertificateDataLen = 0; CK_ATTRIBUTE attr_label_templ = {CKA_LABEL,(CK_VOID_PTR)label,ullabelLen}; CK_ATTRIBUTE attr_value_templ = {CKA_VALUE,(CK_VOID_PTR)value,ulvalueLen}; CK_OBJECT_HANDLE hKey; retval = (functions->C_FindObjectsInit)(*psession_handle, attributes, 1); if (retval == CKR_OK) { CK_ULONG certCount = 0; while (ulObjectCount > 0) { retval = (functions->C_FindObjects)(*psession_handle, &hKey,1,&ulObjectCount); if (ulObjectCount > 0) { attr_label_templ.ulValueLen = 100; retval = (functions->C_GetAttributeValue)(*psession_handle,hKey,&attr_label_templ,1); if (retval == CKR_OK) { pbcertificateData = attr_label_templ.pValue; pbcertificateData[attr_label_templ.ulValueLen] = 0; SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)"certificate found: "); SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)pbcertificateData); } attr_value_templ.ulValueLen = 10239; retval = (functions->C_GetAttributeValue)(*psession_handle,hKey,&attr_value_templ,1); if ((retval == CKR_OK) && (ulcertContextLen > certCount) ) { pbcertificateData = attr_value_templ.pValue; dwcertificateDataLen = attr_value_templ.ulValueLen; if( ImportCertificate(pbserialNumber,ulserialNumberLen,pbcertificateData,dwcertificateDataLen, &(ppCertContext[certCount])) == TRUE) { certCount++; SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)" - registered\r\n"); } else { SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)" - registration failed\r\n"); } //testlog(LVL_INFO,"key LABEL value = %s\n", pbcertificateData); } else { char errormessage[100]; _snprintf(errormessage,100,"C_GetAttributeValue returned 0x%0.8x\r\n",retval); SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)"\r\n"); SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)"ERROR: failed getting attribute value \r\n"); SendMessage(hTextEdit, EM_REPLACESEL,0, (LPARAM)errormessage); } } }//end of while retval = (functions->C_FindObjectsFinal)(*psession_handle); } return retval; }