/*********************************************************************** * DllRegisterServer (CRYPTDLG.@) */ HRESULT WINAPI DllRegisterServer(void) { static WCHAR cryptdlg[] = { 'c','r','y','p','t','d','l','g','.', 'd','l','l',0 }; static WCHAR wintrust[] = { 'w','i','n','t','r','u','s','t','.', 'd','l','l',0 }; static WCHAR certTrustInit[] = { 'C','e','r','t','T','r','u','s','t', 'I','n','i','t',0 }; static WCHAR wintrustCertificateTrust[] = { 'W','i','n','t','r','u','s','t', 'C','e','r','t','i','f','i','c','a','t','e','T','r','u','s','t',0 }; static WCHAR certTrustCertPolicy[] = { 'C','e','r','t','T','r','u','s','t', 'C','e','r','t','P','o','l','i','c','y',0 }; static WCHAR certTrustFinalPolicy[] = { 'C','e','r','t','T','r','u','s','t', 'F','i','n','a','l','P','o','l','i','c','y',0 }; static WCHAR certTrustCleanup[] = { 'C','e','r','t','T','r','u','s','t', 'C','l','e','a','n','u','p',0 }; static const WCHAR cryptDlg[] = { 'c','r','y','p','t','d','l','g','.', 'd','l','l',0 }; CRYPT_REGISTER_ACTIONID reg; GUID guid = CERT_CERTIFICATE_ACTION_VERIFY; HRESULT hr = S_OK; memset(®, 0, sizeof(reg)); reg.cbStruct = sizeof(reg); reg.sInitProvider.cbStruct = sizeof(CRYPT_TRUST_REG_ENTRY); reg.sInitProvider.pwszDLLName = cryptdlg; reg.sInitProvider.pwszFunctionName = certTrustInit; reg.sCertificateProvider.cbStruct = sizeof(CRYPT_TRUST_REG_ENTRY); reg.sCertificateProvider.pwszDLLName = wintrust; reg.sCertificateProvider.pwszFunctionName = wintrustCertificateTrust; reg.sCertificatePolicyProvider.cbStruct = sizeof(CRYPT_TRUST_REG_ENTRY); reg.sCertificatePolicyProvider.pwszDLLName = cryptdlg; reg.sCertificatePolicyProvider.pwszFunctionName = certTrustCertPolicy; reg.sFinalPolicyProvider.cbStruct = sizeof(CRYPT_TRUST_REG_ENTRY); reg.sFinalPolicyProvider.pwszDLLName = cryptdlg; reg.sFinalPolicyProvider.pwszFunctionName = certTrustFinalPolicy; reg.sCleanupProvider.cbStruct = sizeof(CRYPT_TRUST_REG_ENTRY); reg.sCleanupProvider.pwszDLLName = cryptdlg; reg.sCleanupProvider.pwszFunctionName = certTrustCleanup; if (!WintrustAddActionID(&guid, WT_ADD_ACTION_ID_RET_RESULT_FLAG, ®)) hr = GetLastError(); CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_ENCODE_OBJECT_FUNC, "1.3.6.1.4.1.311.16.1.1", cryptDlg, "EncodeAttrSequence"); CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_ENCODE_OBJECT_FUNC, szOID_MICROSOFT_Encryption_Key_Preference, cryptDlg, "EncodeRecipientID"); CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_DECODE_OBJECT_FUNC, "1.3.6.1.4.1.311.16.1.1", cryptDlg, "DecodeAttrSequence"); CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_DECODE_OBJECT_FUNC, szOID_MICROSOFT_Encryption_Key_Preference, cryptDlg, "DecodeRecipientID"); CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_FORMAT_OBJECT_FUNC, szOID_PKIX_KP_EMAIL_PROTECTION, cryptDlg, "FormatPKIXEmailProtection"); CryptRegisterOIDFunction(X509_ASN_ENCODING, CRYPT_OID_FORMAT_OBJECT_FUNC, szOID_CERT_POLICIES, cryptDlg, "FormatVerisignExtension"); return hr; }
static void test_registerOIDFunction(void) { BOOL ret; /* oddly, this succeeds under WinXP; the function name key is merely * omitted. This may be a side effect of the registry code, I don't know. * I don't check it because I doubt anyone would depend on it. ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, NULL, "1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); */ /* On windows XP, GetLastError is incorrectly being set with an HRESULT, * E_INVALIDARG */ ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "foo", NULL, bogusDll, NULL); ok(!ret && GetLastError() == E_INVALIDARG, "Expected E_INVALIDARG: %d\n", GetLastError()); /* This has no effect, but "succeeds" on XP */ ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "foo", "1.2.3.4.5.6.7.8.9.10", NULL, NULL); ok(ret, "Expected pseudo-success, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "CryptDllEncodeObject", "1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); if (!ret && GetLastError() == ERROR_ACCESS_DENIED) { skip("Need admin rights\n"); return; } ok(ret, "CryptRegisterOIDFunction failed: %d\n", GetLastError()); ret = CryptUnregisterOIDFunction(X509_ASN_ENCODING, "CryptDllEncodeObject", "1.2.3.4.5.6.7.8.9.10"); ok(ret, "CryptUnregisterOIDFunction failed: %d\n", GetLastError()); ret = CryptRegisterOIDFunction(X509_ASN_ENCODING, "bogus", "1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); ok(ret, "CryptRegisterOIDFunction failed: %d\n", GetLastError()); ret = CryptUnregisterOIDFunction(X509_ASN_ENCODING, "bogus", "1.2.3.4.5.6.7.8.9.10"); ok(ret, "CryptUnregisterOIDFunction failed: %d\n", GetLastError()); /* Unwanted Cryptography\OID\EncodingType 1\bogus\ will still be there */ ok(!RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography\\OID\\EncodingType 1\\bogus"), "Could not delete bogus key\n"); /* Shouldn't have effect but registry keys are created */ ret = CryptRegisterOIDFunction(PKCS_7_ASN_ENCODING, "CryptDllEncodeObject", "1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); ok(ret, "CryptRegisterOIDFunction failed: %d\n", GetLastError()); ret = CryptUnregisterOIDFunction(PKCS_7_ASN_ENCODING, "CryptDllEncodeObject", "1.2.3.4.5.6.7.8.9.10"); ok(ret, "CryptUnregisterOIDFunction failed: %d\n", GetLastError()); /* Check with bogus encoding type. Registry keys are still created */ ret = CryptRegisterOIDFunction(0, "CryptDllEncodeObject", "1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); ok(ret, "CryptRegisterOIDFunction failed: %d\n", GetLastError()); ret = CryptUnregisterOIDFunction(0, "CryptDllEncodeObject", "1.2.3.4.5.6.7.8.9.10"); ok(ret, "CryptUnregisterOIDFunction failed: %d\n", GetLastError()); /* Unwanted Cryptography\OID\EncodingType 0\CryptDllEncodeObject\ * will still be there */ ok(!RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography\\OID\\EncodingType 0\\CryptDllEncodeObject"), "Could not delete CryptDllEncodeObject key\n"); /* This is written with value 3 verbatim. Thus, the encoding type isn't * (for now) treated as a mask. Registry keys are created. */ ret = CryptRegisterOIDFunction(3, "CryptDllEncodeObject", "1.2.3.4.5.6.7.8.9.10", bogusDll, NULL); ok(ret, "CryptRegisterOIDFunction failed: %d\n", GetLastError()); ret = CryptUnregisterOIDFunction(3, "CryptDllEncodeObject", "1.2.3.4.5.6.7.8.9.10"); ok(ret, "CryptUnregisterOIDFunction failed: %d\n", GetLastError()); /* Unwanted Cryptography\OID\EncodingType 3\CryptDllEncodeObject * will still be there. */ ok(!RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography\\OID\\EncodingType 3\\CryptDllEncodeObject"), "Could not delete CryptDllEncodeObject key\n"); ok(!RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Cryptography\\OID\\EncodingType 3"), "Could not delete 'EncodingType 3' key\n"); }