bool doSign(PluginInstance *obj, NPVariant *args, unsigned argCount, NPVariant *result) { EstEID_log("obj=%p, name=sign argCount=%u", obj, argCount); FAIL_IF_NOT_ALLOWED_SITE; if (argCount < 2) { browserFunctions->setexception(&obj->header, "Missing arguments"); return false; } if(argCount > 2 && NPVARIANT_IS_OBJECT(args[2])){ strncpy(pluginLanguage, getLanguageFromOptions(obj, args[2]), 2); } EstEID_setLocale(pluginLanguage); void* wnd = getNativeWindowHandle(obj); EstEID_PINPromptData pinPromptData = {promptForPIN, showAlert, wnd}; NPUTF8* certId = createStringFromNPVariant(&args[0]); NPUTF8* hash = createStringFromNPVariant(&args[1]); char *signature = NULL; #ifdef _WIN32 DialogData dialogData; dialogData.pin2[0] = '\0'; dialogData.minPin2Length = 5; dialogData.certId = certId; dialogData.hash = hash; dialogData.signature[0] = '\0'; CK_SLOT_ID slotId; if(EstEID_getSlotId(certId, &slotId)){ if(EstEID_isPinPad(slotId)) { signature = EstEID_sign(certId, hash, pinPromptData); } else { DialogBoxParam(pluginInstance, MAKEINTRESOURCEW(IDD_PIN_DIALOG), (HWND)wnd, Pin2DialogProc, (LPARAM)&dialogData); LOG_LOCATION; signature = (char*)malloc(SIGNATURE_BUFFER_SIZE); // check? strcpy(signature, dialogData.signature); } } else { return false; } #else signature = EstEID_sign(certId, hash, pinPromptData); #endif LOG_LOCATION if (signature) { copyStringToNPVariant(signature, result); free(signature); return true; } else { EstEID_log("EstEID_error=%s", EstEID_error); browserFunctions->setexception(&obj->header, EstEID_error); return false; } }
void CEstEIDIEPluginBHO::signWithPKCS11(HINSTANCE hInst, BSTR id, BSTR hash, BSTR *signature) { LOG_LOCATION; char *_signature = NULL; EstEID_errorCode = 0; CK_SLOT_ID slotId; if(id == NULL) { throw CryptoException(ESTEID_CERT_NOT_FOUND_ERROR); } if(EstEID_getSlotId(CW2A(id), &slotId)){ if(EstEID_isPinPad(slotId)) { #ifdef WIN_XP _signature = EstEID_sign(strdup(CW2A(id)), strdup(CW2A(hash)), pinPromptData); if(pinPadDlg != NULL) { pinPadDlg->EndDialog(ESTEID_NO_ERROR); } #endif } else { CEstEidPin2Dlg *pin2Dlg = new CEstEidPin2Dlg(); pin2Dlg->SetCertId(id); pin2Dlg->SetHash(hash); INT result = pin2Dlg->DoModal(); if(!result) { throw CryptoException(ESTEID_USER_CANCEL); } _signature = pin2Dlg->GetSignature(); } if(_signature == NULL) { throw CryptoException(EstEID_errorCode == 0 ? ESTEID_PKCS11_ERROR : EstEID_errorCode); } } else { throw CryptoException(ESTEID_CERT_NOT_FOUND_ERROR); } if (_signature) { *signature = _bstr_t(_signature).Detach(); free(_signature); } else { //TODO:error handling //EstEID_log("EstEID_error=%s", EstEID_error); throw CryptoException(ESTEID_UNKNOWN_ERROR); } }
void CEstEidPin2Dlg::OnBnClickedOk() { LOG_LOCATION; GetDlgItem(IDC_PIN2)->GetWindowText(this->pin2); this->retryCount++; EstEID_PINPromptData pinPromptData = {promptForPIN, showAlert, this->m_hWnd}; pinPromptData.pin2 = strdup(ATL::CT2CA(this->pin2)); this->signature = EstEID_sign(strdup(ATL::CW2A(this->certId)), strdup(ATL::CW2A(this->hash)), pinPromptData); if(this->signature == NULL) { int cardStatus = SetUpPin2Dialog(); if( cardStatus!= CKR_OK) { EndDialogIfPIN2Blocked(cardStatus); } } else { EndDialog(true); } }
bool doSign(PluginInstance *obj, NPVariant *args, unsigned argCount, NPVariant *result) { EstEID_log("obj=%p, name=sign argCount=%u", obj, argCount); FAIL_IF_NOT_ALLOWED_SITE; if (argCount < 2) { browserFunctions->setexception(&obj->header, "Missing arguments"); return false; } if(argCount > 2 && NPVARIANT_IS_OBJECT(args[2])){ strncpy(pluginLanguage, getLanguageFromOptions(obj, args[2]), 2); } EstEID_setLocale(pluginLanguage); if(argCount > 3 && NPVARIANT_IS_OBJECT(args[3])){ strcpy(promptMessage, createStringFromNPVariant(args[3])); } void* wnd = getNativeWindowHandle(obj); EstEID_PINPromptData pinPromptData = {promptForPIN, showAlert, wnd, promptMessage, NULL}; NPUTF8* certId = createStringFromNPVariant(&args[0]); NPUTF8* hash = createStringFromNPVariant(&args[1]); char *signature = NULL; signature = EstEID_sign(certId, hash, pinPromptData); LOG_LOCATION if (signature) { copyStringToNPVariant(signature, result); free(signature); return true; } else { EstEID_log("EstEID_error=%s", EstEID_error); browserFunctions->setexception(&obj->header, EstEID_error); return false; } }