Sync to Wine-0_9_10:

Juan Lang <juan_lang@yahoo.com>
- crypt32: Move context properties to a separate file.
- crypt32: Move serialization functions to serialize.c.
- crypt32: Implement CertGetValidUsages.
- crypt32: Implement CertDuplicateStore.

Sync to Wine-0_9_9:
Juan Lang <juan_lang@yahoo.com>
- crypt32: implement CryptEnumOIDInfo and CryptFindOIDInfo.
- implement CryptEnumOIDInfo and CryptFindOIDInfo
- implement CertOIDToAlgId and CertAlgIdToOID using CryptFindOIDInfo
- crypt32: Move certificate store functions to their own file.
- crypt32: More encoding/decoding.
  Add support for encoding/decoding basic constraints and enhanced key
  usage, with tests.
- crypt32: Move OIDToAlgID and AlgIDToOID to oid.c.
- crypt32: Correct compile problem on gcc 2.95.
- crypt32: Partially implement CertGetNameString.
Henning Gerhardt <henning.gerhardt@web.de>
- crypt32: Add German resource file.
YunSong Hwang <hys545@dreamwiz.com>
- crypt32: Add Korean translation.
Alexander N. Sшrnes <alex@thehandofagony.com>
- Updated/new Norwegian Bokmеl resources.
Eric Pouech <eric.pouech@wanadoo.fr>
- crypt32: Don't access a blob after freeing it.
Sync to Wine-0_9_8:
Juan Lang <juan_lang@yahoo.com>
- crypt32: Fix a fixme, and remove an old comment.
- crypt32: Output string type in trace.
Alexandre Julliard <julliard@winehq.org>
- Include wine/port.h in files that use exceptions.

Sync to Wine-0_9_7:
Juan Lang <juan@codeweavers.com>
- crypt32: Implement CertRDNValueToStrA and CertNameToStrA, with tests.
- crypt32: Correct X509_NAME decoding, and more stringent tests.
- crypt32: Implement CertRDNValueToStrW and CertNameToStrW, with tests.

svn path=/trunk/; revision=21617
This commit is contained in:
Aleksey Bragin 2006-04-16 19:12:28 +00:00
parent e4af2a5bf8
commit 41f90c8fd7
18 changed files with 6057 additions and 3142 deletions

File diff suppressed because it is too large Load diff

View file

@ -12,7 +12,11 @@
<file>encode.c</file>
<file>cert.c</file>
<file>oid.c</file>
<file>proplist.c</file>
<file>protectdata.c</file>
<file>serialize.c</file>
<file>store.c</file>
<file>str.c</file>
<file>crypt32.rc</file>
<file>crypt32.spec</file>
</module>

View file

@ -1,7 +1,36 @@
/* $Id$ */
/*
* crypt32 dll resources
*
* Copyright (C) 2006 Juan Lang
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define REACTOS_VERSION_DLL
#define REACTOS_STR_FILE_DESCRIPTION "Crypt\0"
#define REACTOS_STR_FILE_DESCRIPTION "CryptoAPI Library\0"
#define REACTOS_STR_INTERNAL_NAME "crypt32\0"
#define REACTOS_STR_ORIGINAL_FILENAME "crypt32.dll\0"
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "cryptres.h"
#include <reactos/version.rc>
#include "crypt32_De.rc"
#include "crypt32_En.rc"
#include "crypt32_Ko.rc"
#include "crypt32_No.rc"

View file

@ -6,7 +6,7 @@
@ stdcall CertAddEncodedCertificateToStore(long long ptr long long ptr)
@ stub CertAddEncodedCertificateToSystemStoreA
@ stub CertAddEncodedCertificateToSystemStoreW
@ stub CertAddEnhancedKeyUsageIdentifier
@ stdcall CertAddEnhancedKeyUsageIdentifier(ptr str)
@ stdcall CertAddSerializedElementToStore(ptr ptr long long long long ptr ptr)
@ stdcall CertAddStoreToCollection(ptr ptr long long)
@ stdcall CertAlgIdToOID(long)
@ -26,7 +26,7 @@
@ stub CertDuplicateCRLContext
@ stub CertDuplicateCTLContext
@ stdcall CertDuplicateCertificateContext(ptr)
@ stub CertDuplicateStore
@ stdcall CertDuplicateStore(ptr)
@ stub CertEnumCRLContextProperties
@ stdcall CertEnumCRLsInStore(ptr ptr)
@ stub CertEnumCTLContextProperties
@ -49,23 +49,24 @@
@ stdcall CertGetCTLContextProperty(ptr long ptr ptr)
@ stub CertGetCertificateChain
@ stdcall CertGetCertificateContextProperty(ptr long ptr ptr)
@ stub CertGetEnhancedKeyUsage
@ stdcall CertGetEnhancedKeyUsage(ptr long ptr ptr)
@ stub CertGetIntendedKeyUsage
@ stub CertGetIssuerCertificateFromStore
@ stub CertGetNameStringA
@ stub CertGetNameStringW
@ stdcall CertGetNameStringA(ptr long long ptr ptr long)
@ stdcall CertGetNameStringW(ptr long long ptr ptr long)
@ stub CertGetPublicKeyLength
@ stub CertGetSubjectCertificateFromStore
@ stdcall CertGetValidUsages(long ptr ptr ptr ptr)
@ stub CertIsRDNAttrsInCertificateName
@ stub CertNameToStrA
@ stub CertNameToStrW
@ stdcall CertNameToStrA(long ptr long ptr long)
@ stdcall CertNameToStrW(long ptr long ptr long)
@ stdcall CertOIDToAlgId(str)
@ stdcall CertOpenStore(str long long long ptr)
@ stdcall CertOpenSystemStoreA(long str)
@ stdcall CertOpenSystemStoreW(long wstr)
@ stub CertRDNValueToStrA
@ stub CertRDNValueToStrW
@ stub CertRemoveEnhancedKeyUsageIdentifier
@ stdcall CertRDNValueToStrA(long ptr ptr long)
@ stdcall CertRDNValueToStrW(long ptr ptr long)
@ stdcall CertRemoveEnhancedKeyUsageIdentifier(ptr str)
@ stdcall CertRemoveStoreFromCollection(long long)
@ stdcall CertSaveStore(long long long long ptr long)
@ stdcall CertSerializeCRLStoreElement(ptr long ptr ptr)
@ -74,7 +75,7 @@
@ stdcall CertSetCRLContextProperty(ptr long long ptr)
@ stdcall CertSetCTLContextProperty(ptr long long ptr)
@ stdcall CertSetCertificateContextProperty(ptr long long ptr)
@ stub CertSetEnhancedKeyUsage
@ stdcall CertSetEnhancedKeyUsage(ptr ptr)
@ stub CertStrToNameA
@ stub CertStrToNameW
@ stub CertVerifyCertificateChainPolicy
@ -98,12 +99,12 @@
@ stdcall CryptEncodeObjectEx(long str ptr long ptr ptr ptr)
@ stub CryptEncryptMessage
@ stub CryptEnumOIDFunction
@ stub CryptEnumOIDInfo
@ stdcall CryptEnumOIDInfo(long long ptr ptr)
@ stub CryptEnumProvidersU
@ stub CryptExportPKCS8
@ stdcall CryptExportPublicKeyInfo(long long long ptr ptr)
@ stdcall CryptExportPublicKeyInfoEx(long long long str long ptr ptr ptr)
@ stub CryptFindOIDInfo
@ stdcall CryptFindOIDInfo(long ptr long)
@ stub CryptFormatObject
@ stdcall CryptFreeOIDFunctionAddress(long long)
@ stub CryptGetAsyncParam
@ -140,6 +141,7 @@
@ stub CryptMsgUpdate
@ stub CryptMsgVerifyCountersignatureEncoded
@ stdcall CryptProtectData(ptr wstr ptr ptr ptr long ptr)
@ stdcall CryptQueryObject(long ptr long long long ptr ptr ptr ptr ptr ptr)
@ stdcall CryptRegisterDefaultOIDFunction(long str long wstr)
@ stdcall CryptRegisterOIDFunction(long str str wstr str)
@ stub CryptRegisterOIDInfo
@ -178,10 +180,11 @@
@ stdcall I_CryptFreeTls(long long)
@ stub I_CryptGetDefaultCryptProv
@ stub I_CryptGetDefaultCryptProvForEncrypt
@ stub I_CryptGetOssGlobal
@ stdcall I_CryptGetOssGlobal(long)
@ stdcall I_CryptGetTls(long)
@ stub I_CryptInsertLruEntry
@ stub I_CryptInstallOssGlobal
@ stdcall I_CryptInstallAsn1Module(long long long)
@ stdcall I_CryptInstallOssGlobal(long long long)
@ stub I_CryptReleaseLruEntry
@ stdcall I_CryptSetTls(long ptr)
@ stub I_CryptUninstallOssGlobal

View file

@ -0,0 +1,166 @@
/*
* crypt32 dll resources
*
* Copyright (C) 2006 Henning Gerhardt
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
IDS_AUTHORITY_KEY_ID "Autoritätsschlüsselkennung"
IDS_KEY_ATTRIBUTES "Schlüsselattribute"
IDS_KEY_USAGE_RESTRICTION "Schlüsselbenutzungseinschränkung"
IDS_SUBJECT_ALT_NAME "Alternativer Name des Antragsstellers"
IDS_ISSUER_ALT_NAME "Alternativer Name des Ausgebers"
IDS_BASIC_CONSTRAINTS "Grundsätzliche Einschränkungen"
IDS_KEY_USAGE "Schlüsselbenutzung"
IDS_CERT_POLICIES "Zertifikatsrichtlinien"
IDS_SUBJECT_KEY_IDENTIFIER "Schlüsselkennung des Antragsstellers"
IDS_CRL_REASON_CODE "CRL Grundcode"
IDS_CRL_DIST_POINTS "CRL Verteilungspunkte"
IDS_ENHANCED_KEY_USAGE "Erweiterte Schlüsselbenutzung"
IDS_AUTHORITY_INFO_ACCESS "Autoritätsinformationszugriff"
IDS_CERT_EXTENSIONS "Zertifikatserweiterung"
IDS_NEXT_UPDATE_LOCATION "Next Update Location"
IDS_YES_OR_NO_TRUST "Vertrauen oder nicht vertrauen"
IDS_EMAIL_ADDRESS "E-Mail-Adresse"
IDS_UNSTRUCTURED_NAME "Unstrukturierter Name"
IDS_CONTENT_TYPE "Inhaltstyp"
IDS_MESSAGE_DIGEST "Nachrichtenübersicht"
IDS_SIGNING_TIME "Signierungszeit"
IDS_COUNTER_SIGN "Gegensignatur"
IDS_CHALLENGE_PASSWORD "Challenge Password"
IDS_UNSTRUCTURED_ADDRESS "Unstrukturierte Adresse"
IDS_SMIME_CAPABILITIES "SMIME Möglichkeiten"
IDS_PREFER_SIGNED_DATA "Signierte Daten bevorzugen"
IDS_CPS "CPS"
IDS_USER_NOTICE "Benutzerbenachrichtung"
IDS_OCSP "Online Zertifikationsstatusprotokoll"
IDS_CA_ISSUER "Ausgeber des Zertifikationsautorität"
IDS_CERT_TEMPLATE_NAME "Zertifkationsvorlagenname"
IDS_CERT_TYPE "Zertifikationstyp"
IDS_CERT_MANIFOLD "Zertifikationsvervielfältigung"
IDS_NETSCAPE_CERT_TYPE "Netscape Zertifikationstyp"
IDS_NETSCAPE_BASE_URL "Netscape Basis-URL"
IDS_NETSCAPE_REVOCATION_URL "Netscape Sperrungs-URL"
IDS_NETSCAPE_CA_REVOCATION_URL "Netscape CA Sperrungs-URL"
IDS_NETSCAPE_CERT_RENEWAL_URL "Netscape Zertifikationsernerung-URL"
IDS_NETSCAPE_CA_POLICY_URL "Netscape CA Richtlinien-URL"
IDS_NETSCAPE_SSL_SERVER_NAME "Netscape SSL Servername"
IDS_NETSCAPE_COMMENT "Netscape Kommentar"
IDS_SPC_SP_AGENCY_INFO "SpcSp Agentur-Information"
IDS_SPC_FINANCIAL_CRITERIA "Spc Finanzielle Kriterien"
IDS_SPC_MINIMAL_CRITERIA "Spc Minimale Kriterien"
IDS_COUNTRY "Land/Region"
IDS_ORGANIZATION "Organisation"
IDS_ORGANIZATIONAL_UNIT "Organisationseinheit"
IDS_COMMON_NAME "Allgemeiner Name"
IDS_LOCALITY "Ort"
IDS_STATE_OR_PROVINCE "Bundesland oder Provinz"
IDS_TITLE "Titel"
IDS_GIVEN_NAME "Vorname"
IDS_INITIALS "Initialen"
IDS_SUR_NAME "Nachname"
IDS_DOMAIN_COMPONENT "Domänkomponente"
IDS_STREET_ADDRESS "Straße"
IDS_SERIAL_NUMBER "Seriennummer"
IDS_CA_VERSION "CA Version"
IDS_CROSS_CA_VERSION "Kreuz CA Version"
IDS_SERIALIZED_SIG_SERIAL_NUMBER "Serialisierte Signaturseriennummer"
IDS_PRINCIPAL_NAME "Prinzipalname"
IDS_WINDOWS_PRODUCT_UPDATE "Windows Produkt Aktualisierung"
IDS_ENROLLMENT_NAME_VALUE_PAIR "Wertepaar für Eintragungsname"
IDS_OS_VERSION "Betriebssystemversion"
IDS_ENROLLMENT_CSP "Eintragungs-CSP"
IDS_CRL_NUMBER "CRL Nummer"
IDS_DELTA_CRL_INDICATOR "Delta CRL Indikator"
IDS_ISSUING_DIST_POINT "Ausgeber des Verteilungspunktes"
IDS_FRESHEST_CRL "Aktuelle CRL"
IDS_NAME_CONSTRAINTS "Namenseinschränkungen"
IDS_POLICY_MAPPINGS "Richtlinienzuordnungen"
IDS_POLICY_CONSTRAINTS "Richtlinieneinschränkungen"
IDS_CROSS_CERT_DIST_POINTS "Verteilungspunkte für Kreuzzertifikate"
IDS_APPLICATION_POLICIES "Anwendungsrichtlinien"
IDS_APPLICATION_POLICY_MAPPINGS "Anwendungsrichtlinienzuordnungen"
IDS_APPLICATION_POLICY_CONSTRAINTS "Anweungsungsrichtlinieneinschränkungen"
IDS_CMC_DATA "CMC Daten"
IDS_CMC_RESPONSE "CMC Antwort"
IDS_UNSIGNED_CMC_REQUEST "Unsignierte CMC Antwort"
IDS_CMC_STATUS_INFO "CMC Statusinformation"
IDS_CMC_EXTENSIONS "CMC Erweiterungen"
IDS_CMC_ATTRIBUTES "CMC Attribute"
IDS_PKCS_7_DATA "PKCS 7 Daten"
IDS_PKCS_7_SIGNED "PKCS 7 signiert"
IDS_PKCS_7_ENVELOPED "PKCS 7 umhüllt"
IDS_PKCS_7_SIGNED_ENVELOPED "PKCS 7 signiert und umhüllt"
IDS_PKCS_7_DIGESTED "PKCS 7 Digested"
IDS_PKCS_7_ENCRYPTED "PKCS 7 verschlüsselt"
IDS_PREVIOUS_CA_CERT_HASH "Vorheriger CA Zertifikatshash"
IDS_CRL_VIRTUAL_BASE "Virtuelle Basis-CRL-Nummer"
IDS_CRL_NEXT_PUBLISH "Nächste CRL Veröffentlichung"
IDS_CA_EXCHANGE "CA Verschlüsselungszertifikat"
IDS_KEY_RECOVERY_AGENT "Agent zur Schlüsselwiederherstellung"
IDS_CERTIFICATE_TEMPLATE "Zertifikatsvorlageninformation"
IDS_ENTERPRISE_ROOT_OID "Unternehmensstamm-OID"
IDS_RDN_DUMMY_SIGNER "Attrapenunterzeichner"
IDS_ARCHIVED_KEY_ATTR "Verschlüsselter, privater Schlüssel"
IDS_CRL_SELF_CDP "Veröffentlichte CRL Standorte"
IDS_REQUIRE_CERT_CHAIN_POLICY "Erzwinge Zertifikatskettenrichtlinie"
IDS_TRANSACTION_ID "Transaktions-ID"
IDS_SENDER_NONCE "Sender einstweilen"
IDS_RECIPIENT_NONCE "Empfänger einstweilen"
IDS_REG_INFO "Registrierungsinformationen"
IDS_GET_CERTIFICATE "Bekomme Zertifikat"
IDS_GET_CRL "Bekomme CRL"
IDS_REVOKE_REQUEST "Anfrageablehnen"
IDS_QUERY_PENDING "Wartende Abfrage"
IDS_SORTED_CTL "Zertifikatsvertrauensliste"
IDS_ARCHIVED_KEY_CERT_HASH "Archivierter Schlüsselzertifikatshash"
IDS_PRIVATE_KEY_USAGE_PERIOD "Private Schlüsselbenutzungsdauer"
IDS_CLIENT_INFORMATION "Client Information"
IDS_SERVER_AUTHENTICATION "Server Authentifizierung"
IDS_CLIENT_AUTHENTICATION "Client Authentifizierung"
IDS_CODE_SIGNING "Codesignatur"
IDS_SECURE_EMAIL "Sichere E-Mail"
IDS_TIME_STAMPING "Zeitstempel"
IDS_MICROSOFT_TRUST_LIST_SIGNING "Microsoft Vertrauenslistensignatur"
IDS_MICROSOFT_TIME_STAMPING "Microsoft Zeitstempel"
IDS_IPSEC_END_SYSTEM "IP Sicherheitsendsystem"
IDS_IPSEC_TUNNEL "IP Sicherheitstunnelabschluss"
IDS_IPSEC_USER "IP Sicherheitsbenutzer"
IDS_EFS "Verschlüsseltes Dateisystem"
IDS_WHQL_CRYPTO "Windows Hardware Treiber Verifizierung"
IDS_NT5_CRYPTO "Windows System Komponenten Verifizierung"
IDS_OEM_WHQL_CRYPTO "OEM Windows System Komponenten Verifizierung"
IDS_EMBEDDED_NT_CRYPTO "Embedded Windows System Komponenten Verifizierung"
IDS_KEY_PACK_LICENSES "Schlüsselpaketlizenzen"
IDS_LICENSE_SERVER "Lizenzserver Verifizierung"
IDS_SMART_CARD_LOGON "Smartcard Login"
IDS_DIGITAL_RIGHTS "Digitale Rechte"
IDS_QUALIFIED_SUBORDINATION "Qualifizierte Unterordnung"
IDS_KEY_RECOVERY "Schlüsselwiederherstellung"
IDS_DOCUMENT_SIGNING "Dokumentensignatur"
IDS_IPSEC_IKE_INTERMEDIATE "dazwischenliegende IP Sicherheits-IKE"
IDS_FILE_RECOVERY "Dateiwiederherstellung"
IDS_ROOT_LIST_SIGNER "Stammlistengeber"
IDS_ANY_APPLICATION_POLICIES "Alle Anwendungsrichtlinien"
IDS_DS_EMAIL_REPLICATION "Verzeichnisdienst für E-Mail Replikation"
IDS_ENROLLMENT_AGENT "Agent für Zertifikationsanforderung"
IDS_LIFETIME_SIGNING "Lebensdauersignatur"
IDS_ANY_CERT_POLICY "Alle ausgegebenen Richtlinien"
}

View file

@ -0,0 +1,166 @@
/*
* crypt32 dll resources
*
* Copyright (C) 2006 Juan Lang
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
IDS_AUTHORITY_KEY_ID "Authority Key Identifier"
IDS_KEY_ATTRIBUTES "Key Attributes"
IDS_KEY_USAGE_RESTRICTION "Key Usage Restriction"
IDS_SUBJECT_ALT_NAME "Subject Alternative Name"
IDS_ISSUER_ALT_NAME "Issuer Alternative Name"
IDS_BASIC_CONSTRAINTS "Basic Constraints"
IDS_KEY_USAGE "Key Usage"
IDS_CERT_POLICIES "Certificate Policies"
IDS_SUBJECT_KEY_IDENTIFIER "Subject Key Identifier"
IDS_CRL_REASON_CODE "CRL Reason Code"
IDS_CRL_DIST_POINTS "CRL Distribution Points"
IDS_ENHANCED_KEY_USAGE "Enhanced Key Usage"
IDS_AUTHORITY_INFO_ACCESS "Authority Information Access"
IDS_CERT_EXTENSIONS "Certificate Extensions"
IDS_NEXT_UPDATE_LOCATION "Next Update Location"
IDS_YES_OR_NO_TRUST "Yes or No Trust"
IDS_EMAIL_ADDRESS "Email Address"
IDS_UNSTRUCTURED_NAME "Unstructured Name"
IDS_CONTENT_TYPE "Content Type"
IDS_MESSAGE_DIGEST "Message Digest"
IDS_SIGNING_TIME "Signing Time"
IDS_COUNTER_SIGN "Counter Sign"
IDS_CHALLENGE_PASSWORD "Challenge Password"
IDS_UNSTRUCTURED_ADDRESS "Unstructured Address"
IDS_SMIME_CAPABILITIES "SMIME Capabilities"
IDS_PREFER_SIGNED_DATA "Prefer Signed Data"
IDS_CPS "CPS"
IDS_USER_NOTICE "User Notice"
IDS_OCSP "On-line Certificate Status Protocol"
IDS_CA_ISSUER "Certification Authority Issuer"
IDS_CERT_TEMPLATE_NAME "Certification Template Name"
IDS_CERT_TYPE "Certificate Type"
IDS_CERT_MANIFOLD "Certificate Manifold"
IDS_NETSCAPE_CERT_TYPE "Netscape Cert Type"
IDS_NETSCAPE_BASE_URL "Netscape Base URL"
IDS_NETSCAPE_REVOCATION_URL "Netscape Revocation URL"
IDS_NETSCAPE_CA_REVOCATION_URL "Netscape CA Revocation URL"
IDS_NETSCAPE_CERT_RENEWAL_URL "Netscape Cert Renewal URL"
IDS_NETSCAPE_CA_POLICY_URL "Netscape CA Policy URL"
IDS_NETSCAPE_SSL_SERVER_NAME "Netscape SSL ServerName"
IDS_NETSCAPE_COMMENT "Netscape Comment"
IDS_SPC_SP_AGENCY_INFO "SpcSpAgencyInfo"
IDS_SPC_FINANCIAL_CRITERIA "SpcFinancialCriteria"
IDS_SPC_MINIMAL_CRITERIA "SpcMinimalCriteria"
IDS_COUNTRY "Country/Region"
IDS_ORGANIZATION "Organization"
IDS_ORGANIZATIONAL_UNIT "Organizational Unit"
IDS_COMMON_NAME "Common Name"
IDS_LOCALITY "Locality"
IDS_STATE_OR_PROVINCE "State or Province"
IDS_TITLE "Title"
IDS_GIVEN_NAME "Given Name"
IDS_INITIALS "Initials"
IDS_SUR_NAME "Sur Name"
IDS_DOMAIN_COMPONENT "Domain Component"
IDS_STREET_ADDRESS "Street Address"
IDS_SERIAL_NUMBER "Serial Number"
IDS_CA_VERSION "CA Version"
IDS_CROSS_CA_VERSION "Cross CA Version"
IDS_SERIALIZED_SIG_SERIAL_NUMBER "Serialized Signature Serial Number"
IDS_PRINCIPAL_NAME "Principal Name"
IDS_WINDOWS_PRODUCT_UPDATE "Windows Product Update"
IDS_ENROLLMENT_NAME_VALUE_PAIR "Enrollment Name Value Pair"
IDS_OS_VERSION "OS Version"
IDS_ENROLLMENT_CSP "Enrollment CSP"
IDS_CRL_NUMBER "CRL Number"
IDS_DELTA_CRL_INDICATOR "Delta CRL Indicator"
IDS_ISSUING_DIST_POINT "Issuing Distribution Point"
IDS_FRESHEST_CRL "Freshest CRL"
IDS_NAME_CONSTRAINTS "Name Constraints"
IDS_POLICY_MAPPINGS "Policy Mappings"
IDS_POLICY_CONSTRAINTS "Policy Constraints"
IDS_CROSS_CERT_DIST_POINTS "Cross-Certificate Distribution Points"
IDS_APPLICATION_POLICIES "Application Policies"
IDS_APPLICATION_POLICY_MAPPINGS "Application Policy Mappings"
IDS_APPLICATION_POLICY_CONSTRAINTS "Application Policy Constraints"
IDS_CMC_DATA "CMC Data"
IDS_CMC_RESPONSE "CMC Response"
IDS_UNSIGNED_CMC_REQUEST "Unsigned CMC Request"
IDS_CMC_STATUS_INFO "CMC Status Info"
IDS_CMC_EXTENSIONS "CMC Extensions"
IDS_CMC_ATTRIBUTES "CMC Attributes"
IDS_PKCS_7_DATA "PKCS 7 Data"
IDS_PKCS_7_SIGNED "PKCS 7 Signed"
IDS_PKCS_7_ENVELOPED "PKCS 7 Enveloped"
IDS_PKCS_7_SIGNED_ENVELOPED "PKCS 7 Signed Enveloped"
IDS_PKCS_7_DIGESTED "PKCS 7 Digested"
IDS_PKCS_7_ENCRYPTED "PKCS 7 Encrypted"
IDS_PREVIOUS_CA_CERT_HASH "Previous CA Certificate Hash"
IDS_CRL_VIRTUAL_BASE "Virtual Base CRL Number"
IDS_CRL_NEXT_PUBLISH "Next CRL Publish"
IDS_CA_EXCHANGE "CA Encryption Certificate"
IDS_KEY_RECOVERY_AGENT "Key Recovery Agent"
IDS_CERTIFICATE_TEMPLATE "Certificate Template Information"
IDS_ENTERPRISE_ROOT_OID "Enterprise Root OID"
IDS_RDN_DUMMY_SIGNER "Dummy Signer"
IDS_ARCHIVED_KEY_ATTR "Encrypted Private Key"
IDS_CRL_SELF_CDP "Published CRL Locations"
IDS_REQUIRE_CERT_CHAIN_POLICY "Enforce Certificate Chain Policy"
IDS_TRANSACTION_ID "Transaction Id"
IDS_SENDER_NONCE "Sender Nonce"
IDS_RECIPIENT_NONCE "Recipient Nonce"
IDS_REG_INFO "Reg Info"
IDS_GET_CERTIFICATE "Get Certificate"
IDS_GET_CRL "Get CRL"
IDS_REVOKE_REQUEST "Revoke Request"
IDS_QUERY_PENDING "Query Pending"
IDS_SORTED_CTL "Certificate Trust List"
IDS_ARCHIVED_KEY_CERT_HASH "Archived Key Certificate Hash"
IDS_PRIVATE_KEY_USAGE_PERIOD "Private Key Usage Period"
IDS_CLIENT_INFORMATION "Client Information"
IDS_SERVER_AUTHENTICATION "Server Authentication"
IDS_CLIENT_AUTHENTICATION "Client Authentication"
IDS_CODE_SIGNING "Code Signing"
IDS_SECURE_EMAIL "Secure Email"
IDS_TIME_STAMPING "Time Stamping"
IDS_MICROSOFT_TRUST_LIST_SIGNING "Microsoft Trust List Signing"
IDS_MICROSOFT_TIME_STAMPING "Microsoft Time Stamping"
IDS_IPSEC_END_SYSTEM "IP security end system"
IDS_IPSEC_TUNNEL "IP security tunnel termination"
IDS_IPSEC_USER "IP security user"
IDS_EFS "Encrypting File System"
IDS_WHQL_CRYPTO "Windows Hardware Driver Verification"
IDS_NT5_CRYPTO "Windows System Component Verification"
IDS_OEM_WHQL_CRYPTO "OEM Windows System Component Verification"
IDS_EMBEDDED_NT_CRYPTO "Embedded Windows System Component Verification"
IDS_KEY_PACK_LICENSES "Key Pack Licenses"
IDS_LICENSE_SERVER "License Server Verification"
IDS_SMART_CARD_LOGON "Smart Card Logon"
IDS_DIGITAL_RIGHTS "Digital Rights"
IDS_QUALIFIED_SUBORDINATION "Qualified Subordination"
IDS_KEY_RECOVERY "Key Recovery"
IDS_DOCUMENT_SIGNING "Document Signing"
IDS_IPSEC_IKE_INTERMEDIATE "IP security IKE intermediate"
IDS_FILE_RECOVERY "File Recovery"
IDS_ROOT_LIST_SIGNER "Root List Signer"
IDS_ANY_APPLICATION_POLICIES "All application policies"
IDS_DS_EMAIL_REPLICATION "Directory Service Email Replication"
IDS_ENROLLMENT_AGENT "Certificate Request Agent"
IDS_LIFETIME_SIGNING "Lifetime Signing"
IDS_ANY_CERT_POLICY "All issuance policies"
}

View file

@ -0,0 +1,167 @@
/*
* crypt32 dll resources
*
* Copyright (C) 2006 Juan Lang
* Copyright (C) 2006 YunSong Hwang
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
IDS_AUTHORITY_KEY_ID "접근 키 식별자"
IDS_KEY_ATTRIBUTES "키 속성"
IDS_KEY_USAGE_RESTRICTION "키 사용 제한"
IDS_SUBJECT_ALT_NAME "주제(subject) 대체 이름"
IDS_ISSUER_ALT_NAME "발행자 대체 이름"
IDS_BASIC_CONSTRAINTS "기본 제약"
IDS_KEY_USAGE "키 사용법"
IDS_CERT_POLICIES "인증 방침"
IDS_SUBJECT_KEY_IDENTIFIER "주제(Subject)키 식별자"
IDS_CRL_REASON_CODE "CRL 분별 코드"
IDS_CRL_DIST_POINTS "CRL 배포 지점"
IDS_ENHANCED_KEY_USAGE "확장된 키 사용법"
IDS_AUTHORITY_INFO_ACCESS "권한 정보 접근"
IDS_CERT_EXTENSIONS "인증서 확장(Certificate Extensions)"
IDS_NEXT_UPDATE_LOCATION "다음 업데이트 위치"
IDS_YES_OR_NO_TRUST "신뢰(예 나 아니오)"
IDS_EMAIL_ADDRESS "이메일 주소"
IDS_UNSTRUCTURED_NAME "비구조화 이름"
IDS_CONTENT_TYPE "내용 형식"
IDS_MESSAGE_DIGEST "내용 요약"
IDS_SIGNING_TIME "서명 시간"
IDS_COUNTER_SIGN "역 서명(Counter Sign)"
IDS_CHALLENGE_PASSWORD "암호 바꾸기"
IDS_UNSTRUCTURED_ADDRESS "비구조화 주소"
IDS_SMIME_CAPABILITIES "SMIME 특성"
IDS_PREFER_SIGNED_DATA "선호하는 사인된 데이타(Prefer Signed Data)"
IDS_CPS "CPS"
IDS_USER_NOTICE "사용자 통지"
IDS_OCSP "온라인 인증 상태 프로토콜"
IDS_CA_ISSUER "인증서 접근 발행자"
IDS_CERT_TEMPLATE_NAME "인증 형판 이름"
IDS_CERT_TYPE "인증서 형태"
IDS_CERT_MANIFOLD "인증서 사본"
IDS_NETSCAPE_CERT_TYPE "넷스케이프 인증 형태"
IDS_NETSCAPE_BASE_URL "넷스케이프 기본 웹주소"
IDS_NETSCAPE_REVOCATION_URL "넷스케이프 취소 웹주소"
IDS_NETSCAPE_CA_REVOCATION_URL "넷스케이프 CA 취소 웹주소"
IDS_NETSCAPE_CERT_RENEWAL_URL "넷스케이프 인증서 재개 웹주소"
IDS_NETSCAPE_CA_POLICY_URL "넷스케이프 CA 방침 URL"
IDS_NETSCAPE_SSL_SERVER_NAME "넷스케이프 SSL 서버이름"
IDS_NETSCAPE_COMMENT "넷스케이프 설명"
IDS_SPC_SP_AGENCY_INFO "SpcSp관리자 정보"
IDS_SPC_FINANCIAL_CRITERIA "Spc재정상 원칙"
IDS_SPC_MINIMAL_CRITERIA "Spc최소 원칙"
IDS_COUNTRY "나라/지역"
IDS_ORGANIZATION "단체"
IDS_ORGANIZATIONAL_UNIT "단체(Organizational Unit)"
IDS_COMMON_NAME "애칭"
IDS_LOCALITY "소재지"
IDS_STATE_OR_PROVINCE "주나 지방"
IDS_TITLE "제목"
IDS_GIVEN_NAME "주어진 이름"
IDS_INITIALS "머릿글자"
IDS_SUR_NAME "성"
IDS_DOMAIN_COMPONENT "주소 구성요소"
IDS_STREET_ADDRESS "거리 주소"
IDS_SERIAL_NUMBER "시리얼 번호"
IDS_CA_VERSION "CA 버젼"
IDS_CROSS_CA_VERSION "교차 CA 버젼"
IDS_SERIALIZED_SIG_SERIAL_NUMBER "연속된(Serialized) 서명 시리얼 넘버"
IDS_PRINCIPAL_NAME "주요한 이름"
IDS_WINDOWS_PRODUCT_UPDATE "윈도우즈 제품 업데이트"
IDS_ENROLLMENT_NAME_VALUE_PAIR "등록 이름 값의 쌍"
IDS_OS_VERSION "OS 버젼"
IDS_ENROLLMENT_CSP "CSP 등록"
IDS_CRL_NUMBER "CRL 번호"
IDS_DELTA_CRL_INDICATOR "델타 CRL 표시기"
IDS_ISSUING_DIST_POINT "발행자 배포 위치"
IDS_FRESHEST_CRL "최신 CRL"
IDS_NAME_CONSTRAINTS "이름 제약"
IDS_POLICY_MAPPINGS "정책 대응"
IDS_POLICY_CONSTRAINTS "정책 제약"
IDS_CROSS_CERT_DIST_POINTS "상호 인증 분배 위치"
IDS_APPLICATION_POLICIES "풀그림 방침"
IDS_APPLICATION_POLICY_MAPPINGS "풀그림 정책 대응(Mappings)"
IDS_APPLICATION_POLICY_CONSTRAINTS "풀그림 정책 제약"
IDS_CMC_DATA "CMC 데이타"
IDS_CMC_RESPONSE "CMC 응답"
IDS_UNSIGNED_CMC_REQUEST "서명되지 않은CMC 요청"
IDS_CMC_STATUS_INFO "CMC 상태 정보"
IDS_CMC_EXTENSIONS "CMC 확장"
IDS_CMC_ATTRIBUTES "CMC 속성"
IDS_PKCS_7_DATA "PKCS 7 데이타"
IDS_PKCS_7_SIGNED "PKCS 7 서명"
IDS_PKCS_7_ENVELOPED "PKCS 7 싸개"
IDS_PKCS_7_SIGNED_ENVELOPED "PKCS 7 서명된 싸개"
IDS_PKCS_7_DIGESTED "PKCS 7 요약"
IDS_PKCS_7_ENCRYPTED "PKCS 7 암호화"
IDS_PREVIOUS_CA_CERT_HASH "이전의 CA 인증 해쉬"
IDS_CRL_VIRTUAL_BASE "가상 기반 CRL 숫자(Virtual Base CRL Number)"
IDS_CRL_NEXT_PUBLISH "다음 CRL 발행"
IDS_CA_EXCHANGE "CA 암호 인증"
IDS_KEY_RECOVERY_AGENT "키 복구 관리자"
IDS_CERTIFICATE_TEMPLATE "인증 주형(Template) 정보"
IDS_ENTERPRISE_ROOT_OID "기업 루트 OID"
IDS_RDN_DUMMY_SIGNER "가짜 사인자(Dummy Signer)"
IDS_ARCHIVED_KEY_ATTR "암호화된 개인 키"
IDS_CRL_SELF_CDP "발행된 CRL 위치"
IDS_REQUIRE_CERT_CHAIN_POLICY "강제 인증 체인 정책(Enforce Certificate Chain Policy)"
IDS_TRANSACTION_ID "처리 Id"
IDS_SENDER_NONCE "임시 발송인"
IDS_RECIPIENT_NONCE "임시 수령인"
IDS_REG_INFO "등록 정보"
IDS_GET_CERTIFICATE "인증서 얻기"
IDS_GET_CRL "CRL 얻기"
IDS_REVOKE_REQUEST "취소 요청"
IDS_QUERY_PENDING "질문하는 중"
IDS_SORTED_CTL "인증된 신뢰 목록"
IDS_ARCHIVED_KEY_CERT_HASH "압축된 키 인증 해쉬"
IDS_PRIVATE_KEY_USAGE_PERIOD "개인 키 사용 기간"
IDS_CLIENT_INFORMATION "클라이언트 정보"
IDS_SERVER_AUTHENTICATION "서버 인증"
IDS_CLIENT_AUTHENTICATION "클라이언트 인증"
IDS_CODE_SIGNING "코드 서명"
IDS_SECURE_EMAIL "보안 이메일"
IDS_TIME_STAMPING "시간 날인"
IDS_MICROSOFT_TRUST_LIST_SIGNING "마이크로소프트 신뢰 목록 사인"
IDS_MICROSOFT_TIME_STAMPING "마이크로소프트 시간 날인"
IDS_IPSEC_END_SYSTEM "IP 보안 종단 시스템"
IDS_IPSEC_TUNNEL "IP 보안 터널 종료(tunnel termination)"
IDS_IPSEC_USER "IP 보안 사용자"
IDS_EFS "암호화된 파일 시스템"
IDS_WHQL_CRYPTO "윈도우즈 하드웨어 드라이버 검증"
IDS_NT5_CRYPTO "윈도우즈 시스템 구성요소 검증"
IDS_OEM_WHQL_CRYPTO "OEM 윈도우즈 시스템 구성요소 검증"
IDS_EMBEDDED_NT_CRYPTO "내장된 윈도우즈 시스탬 구성요소 검중"
IDS_KEY_PACK_LICENSES "키 팩 라이센스"
IDS_LICENSE_SERVER "라이센스 서버 검증"
IDS_SMART_CARD_LOGON "스마트 카드 로그인"
IDS_DIGITAL_RIGHTS "디지털 저작권"
IDS_QUALIFIED_SUBORDINATION "자격있는 종속관계"
IDS_KEY_RECOVERY "키 복구"
IDS_DOCUMENT_SIGNING "문서 서명"
IDS_IPSEC_IKE_INTERMEDIATE "IP 보안 IKE 수단(intermediate)"
IDS_FILE_RECOVERY "파일 복구"
IDS_ROOT_LIST_SIGNER "루트 목록 서명자"
IDS_ANY_APPLICATION_POLICIES "모든 풀그림의 방침"
IDS_DS_EMAIL_REPLICATION "디렉토리 서비스 이메일 응답"
IDS_ENROLLMENT_AGENT "인증 요구 관리자"
IDS_LIFETIME_SIGNING "평생 서명"
IDS_ANY_CERT_POLICY "모든 배포 방침"
}

View file

@ -0,0 +1,166 @@
/*
* crypt32 dll resources
*
* Copyright (C) 2006 Alexander N. Sørnes <alex@thehandofagony.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
STRINGTABLE DISCARDABLE
{
IDS_AUTHORITY_KEY_ID "Identifiserer for autentiseringsnøkkel"
IDS_KEY_ATTRIBUTES "Nøkkelegenskaper"
IDS_KEY_USAGE_RESTRICTION "Begrensning av nøkkelbruk"
IDS_SUBJECT_ALT_NAME "Alternativt navn for emne"
IDS_ISSUER_ALT_NAME "Alternativt navn for utsteder"
IDS_BASIC_CONSTRAINTS "Basisbegrensninger"
IDS_KEY_USAGE "Nøkkelbruk"
IDS_CERT_POLICIES "Sertifikatholdninger"
IDS_SUBJECT_KEY_IDENTIFIER "Identifiserer for emnenøkkel"
IDS_CRL_REASON_CODE "CRL-grunnkode"
IDS_CRL_DIST_POINTS "CRL-distribusjonspunkter"
IDS_ENHANCED_KEY_USAGE "Forbedret nøkkelbruk"
IDS_AUTHORITY_INFO_ACCESS "Myndighet-informasjonstilgang"
IDS_CERT_EXTENSIONS "Sertifikatutvidelser"
IDS_NEXT_UPDATE_LOCATION "Neste oppdateringsplassering"
IDS_YES_OR_NO_TRUST "Ja eller nei tillit"
IDS_EMAIL_ADDRESS "E-postadresse"
IDS_UNSTRUCTURED_NAME "Ustrukturert navn"
IDS_CONTENT_TYPE "Innholdstype"
IDS_MESSAGE_DIGEST "Meldingssammendrag"
IDS_SIGNING_TIME "Signeringstidspunkt"
IDS_COUNTER_SIGN "Tellersymbol"
IDS_CHALLENGE_PASSWORD "Utfordre passord"
IDS_UNSTRUCTURED_ADDRESS "Ustrukturert adresse"
IDS_SMIME_CAPABILITIES "SMIME-evner"
IDS_PREFER_SIGNED_DATA "Fortrekk signert data"
IDS_CPS "CPS"
IDS_USER_NOTICE "Brukervarsel"
IDS_OCSP "On-line Certificate Status Protocol"
IDS_CA_ISSUER "Utsteder for sertifiseringsautoritet"
IDS_CERT_TEMPLATE_NAME "Navn på sertifiseringsmal"
IDS_CERT_TYPE "Sertifikattype"
IDS_CERT_MANIFOLD "Sertifikatmangfold"
IDS_NETSCAPE_CERT_TYPE "Netscape-sertifikattype"
IDS_NETSCAPE_BASE_URL "Netscape-basis-URL"
IDS_NETSCAPE_REVOCATION_URL "Netscape-tilbakekalling-URL"
IDS_NETSCAPE_CA_REVOCATION_URL "Netscape-CA-tilbakekalling-URLURL"
IDS_NETSCAPE_CERT_RENEWAL_URL "Netscape-sertifikatfornying-URL"
IDS_NETSCAPE_CA_POLICY_URL "Netscape-CA-politikk-URL"
IDS_NETSCAPE_SSL_SERVER_NAME "Netscape-SSL-tjenernavn"
IDS_NETSCAPE_COMMENT "Netscape-kommentar"
IDS_SPC_SP_AGENCY_INFO "SpcSpAgencyInfo"
IDS_SPC_FINANCIAL_CRITERIA "SpcFinancialCriteria"
IDS_SPC_MINIMAL_CRITERIA "SpcMinimalCriteria"
IDS_COUNTRY "Land/Region"
IDS_ORGANIZATION "Organisasjon"
IDS_ORGANIZATIONAL_UNIT "Organisasjonsell enhet"
IDS_COMMON_NAME "Vanlig navn"
IDS_LOCALITY "Lokalitet"
IDS_STATE_OR_PROVINCE "Fylke"
IDS_TITLE "Tittel"
IDS_GIVEN_NAME "Oppgitt navn"
IDS_INITIALS "Initialer"
IDS_SUR_NAME "Etternavn"
IDS_DOMAIN_COMPONENT "Domenekomponent"
IDS_STREET_ADDRESS "Gateadresse"
IDS_SERIAL_NUMBER "Serienummer"
IDS_CA_VERSION "CA-versjon"
IDS_CROSS_CA_VERSION "Kryss CA-versjon"
IDS_SERIALIZED_SIG_SERIAL_NUMBER "Serienummer for serialisert signatur"
IDS_PRINCIPAL_NAME "Hovednavn"
IDS_WINDOWS_PRODUCT_UPDATE "Windows-produktoppdatering"
IDS_ENROLLMENT_NAME_VALUE_PAIR "Innrullerings-navneverdipar"
IDS_OS_VERSION "OS-versjon"
IDS_ENROLLMENT_CSP "Innrullerings-CSP"
IDS_CRL_NUMBER "CRL-nummer"
IDS_DELTA_CRL_INDICATOR "Delta CRL-indikator"
IDS_ISSUING_DIST_POINT "Utsteder distribusjonspunkt"
IDS_FRESHEST_CRL "Nyeste CRL"
IDS_NAME_CONSTRAINTS "Navnebegrensninger"
IDS_POLICY_MAPPINGS "Framgangsmåtekartlegginger"
IDS_POLICY_CONSTRAINTS "Framgangsmåtebegresninger"
IDS_CROSS_CERT_DIST_POINTS "Distribusjonspunkter for kryss-sertifikat"
IDS_APPLICATION_POLICIES "Framgangsmåter for programmers"
IDS_APPLICATION_POLICY_MAPPINGS "Framgangsmåtekartlegginger for programmer"
IDS_APPLICATION_POLICY_CONSTRAINTS "Framgangsmåtebegrensninger for programmer"
IDS_CMC_DATA "CMC-data"
IDS_CMC_RESPONSE "CMS-svar"
IDS_UNSIGNED_CMC_REQUEST "Usignert CMC-forespørsel"
IDS_CMC_STATUS_INFO "CMC-statusinformasjon"
IDS_CMC_EXTENSIONS "CMC-utvidelser"
IDS_CMC_ATTRIBUTES "CMC-egenskaper"
IDS_PKCS_7_DATA "PKCS 7 Data"
IDS_PKCS_7_SIGNED "PKCS 7 Signert"
IDS_PKCS_7_ENVELOPED "PKCS 7 Innpakket"
IDS_PKCS_7_SIGNED_ENVELOPED "PKCS 7 Signert Innpakket"
IDS_PKCS_7_DIGESTED "PKCS 7 Fordøyet"
IDS_PKCS_7_ENCRYPTED "PKCS 7 Kryptert"
IDS_PREVIOUS_CA_CERT_HASH "Forrige CA-sertifikatlappskaus"
IDS_CRL_VIRTUAL_BASE "Virtuelt basis-CRL-nummer"
IDS_CRL_NEXT_PUBLISH "Neste CRL-utgiving"
IDS_CA_EXCHANGE "CA-krypteringssertifikat"
IDS_KEY_RECOVERY_AGENT "Agent for nøkkelgjenoppretting"
IDS_CERTIFICATE_TEMPLATE "Informasjon om sertifikatmal"
IDS_ENTERPRISE_ROOT_OID "Storselskap-rot-OID"
IDS_RDN_DUMMY_SIGNER "Tullesignerer"
IDS_ARCHIVED_KEY_ATTR "Kryptert privat nøkkel"
IDS_CRL_SELF_CDP "Publisert CRL-plasseringer"
IDS_REQUIRE_CERT_CHAIN_POLICY "Håndhev sertifikatlenkepolitikk"
IDS_TRANSACTION_ID "Transaksjons-id"
IDS_SENDER_NONCE "Gjeldende sender"
IDS_RECIPIENT_NONCE "Gjeldende mottaker"
IDS_REG_INFO "Reg info"
IDS_GET_CERTIFICATE "Hent sertifikat"
IDS_GET_CRL "Hent CRL"
IDS_REVOKE_REQUEST "Gjenoppliv forespørsel"
IDS_QUERY_PENDING "Spørring venter"
IDS_SORTED_CTL "Tillitsliste for sertifikater"
IDS_ARCHIVED_KEY_CERT_HASH "Arkivert nøkkelsertifikatlappskaus"
IDS_PRIVATE_KEY_USAGE_PERIOD "Privat nøkkelbrukperiode"
IDS_CLIENT_INFORMATION "Klientinformasjon"
IDS_SERVER_AUTHENTICATION "Tjenerautentisering"
IDS_CLIENT_AUTHENTICATION "Klientautentisering"
IDS_CODE_SIGNING "Kodesignering"
IDS_SECURE_EMAIL "Sikker e-post"
IDS_TIME_STAMPING "Tidsstempling"
IDS_MICROSOFT_TRUST_LIST_SIGNING "Microsoft tillitslistesignering"
IDS_MICROSOFT_TIME_STAMPING "Microsoft tidsstempling"
IDS_IPSEC_END_SYSTEM "IP-sikkerhetsendesystem"
IDS_IPSEC_TUNNEL "IP-sikkerhetstunnel-terminering"
IDS_IPSEC_USER "IP-sikkerhetsbruker"
IDS_EFS "Krypterer filsystem"
IDS_WHQL_CRYPTO "Windows maskinvaredriver-godkjenning"
IDS_NT5_CRYPTO "Windows sytemkomponent-godkjenning"
IDS_OEM_WHQL_CRYPTO "OEM Windows systemkomponent-godkjenning"
IDS_EMBEDDED_NT_CRYPTO "Innebygget Windows systemkomponent-godkjenning"
IDS_KEY_PACK_LICENSES "Nøkkelpakkelisenser"
IDS_LICENSE_SERVER "Lisenstjener-verifisering"
IDS_SMART_CARD_LOGON "Smart Card-pålogging"
IDS_DIGITAL_RIGHTS "Digitale rettigheter"
IDS_QUALIFIED_SUBORDINATION "Kvalifisert underordinering"
IDS_KEY_RECOVERY "Nøkkelgjenoppretting"
IDS_DOCUMENT_SIGNING "Dokumentsignering"
IDS_IPSEC_IKE_INTERMEDIATE "IP-sikkerhet IKE viderekommen"
IDS_FILE_RECOVERY "Filgjenoppretting"
IDS_ROOT_LIST_SIGNER "Rotlistesignerer"
IDS_ANY_APPLICATION_POLICIES "Alle framgangsmåter for programmer"
IDS_DS_EMAIL_REPLICATION "Katalogtjeneste e-postreplikering"
IDS_ENROLLMENT_AGENT "Agent for sertifikatforespørsler"
IDS_LIFETIME_SIGNING "Livstidsignering"
IDS_ANY_CERT_POLICY "Alle framgangsmåter for utsteding"
}

View file

@ -19,12 +19,53 @@
#ifndef __CRYPT32_PRIVATE_H__
#define __CRYPT32_PRIVATE_H__
/* The following aren't defined in wincrypt.h, as they're "reserved" */
#define CERT_CERT_PROP_ID 32
#define CERT_CRL_PROP_ID 33
#define CERT_CTL_PROP_ID 34
/* Returns a handle to the default crypto provider; loads it if necessary.
* Returns NULL on failure.
*/
HCRYPTPROV CRYPT_GetDefaultProvider(void);
void CRYPT_InitFunctionSets(void);
void CRYPT_FreeFunctionSets(void);
void crypt_oid_init(HINSTANCE hinst);
void crypt_oid_free(void);
/* Helper function for store reading functions and
* CertAddSerializedElementToStore. Returns a context of the appropriate type
* if it can, or NULL otherwise. Doesn't validate any of the properties in
* the serialized context (for example, bad hashes are retained.)
* *pdwContentType is set to the type of the returned context.
*/
const void *CRYPT_ReadSerializedElement(const BYTE *pbElement,
DWORD cbElement, DWORD dwContextTypeFlags, DWORD *pdwContentType);
/**
* Context property list functions
*/
struct _CONTEXT_PROPERTY_LIST;
typedef struct _CONTEXT_PROPERTY_LIST *PCONTEXT_PROPERTY_LIST;
PCONTEXT_PROPERTY_LIST ContextPropertyList_Create(void);
/* Searches for the property with ID id in the context. Returns TRUE if found,
* and copies the property's length and a pointer to its data to blob.
* Otherwise returns FALSE.
*/
BOOL ContextPropertyList_FindProperty(PCONTEXT_PROPERTY_LIST list, DWORD id,
PCRYPT_DATA_BLOB blob);
BOOL ContextPropertyList_SetProperty(PCONTEXT_PROPERTY_LIST list, DWORD id,
const BYTE *pbData, size_t cbData);
void ContextPropertyList_RemoveProperty(PCONTEXT_PROPERTY_LIST list, DWORD id);
DWORD ContextPropertyList_EnumPropIDs(PCONTEXT_PROPERTY_LIST list, DWORD id);
void ContextPropertyList_Copy(PCONTEXT_PROPERTY_LIST to,
PCONTEXT_PROPERTY_LIST from);
void ContextPropertyList_Free(PCONTEXT_PROPERTY_LIST list);
#endif

View file

@ -0,0 +1,163 @@
/*
* Copyright 2006 Juan Lang
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __WINE_CRYPTRES_H__
#define __WINE_CRYPTRES_H__
#define IDS_AUTHORITY_KEY_ID 1000
#define IDS_KEY_ATTRIBUTES 1001
#define IDS_KEY_USAGE_RESTRICTION 1002
#define IDS_SUBJECT_ALT_NAME 1003
#define IDS_ISSUER_ALT_NAME 1004
#define IDS_BASIC_CONSTRAINTS 1005
#define IDS_KEY_USAGE 1006
#define IDS_CERT_POLICIES 1007
#define IDS_SUBJECT_KEY_IDENTIFIER 1008
#define IDS_CRL_REASON_CODE 1009
#define IDS_CRL_DIST_POINTS 1010
#define IDS_ENHANCED_KEY_USAGE 1011
#define IDS_AUTHORITY_INFO_ACCESS 1012
#define IDS_CERT_EXTENSIONS 1013
#define IDS_NEXT_UPDATE_LOCATION 1014
#define IDS_YES_OR_NO_TRUST 1015
#define IDS_EMAIL_ADDRESS 1016
#define IDS_UNSTRUCTURED_NAME 1017
#define IDS_CONTENT_TYPE 1018
#define IDS_MESSAGE_DIGEST 1019
#define IDS_SIGNING_TIME 1020
#define IDS_COUNTER_SIGN 1021
#define IDS_CHALLENGE_PASSWORD 1022
#define IDS_UNSTRUCTURED_ADDRESS 1023
#define IDS_SMIME_CAPABILITIES 1024
#define IDS_PREFER_SIGNED_DATA 1025
#define IDS_CPS 1026
#define IDS_USER_NOTICE 1027
#define IDS_OCSP 1028
#define IDS_CA_ISSUER 1029
#define IDS_CERT_TEMPLATE_NAME 1030
#define IDS_CERT_TYPE 1031
#define IDS_CERT_MANIFOLD 1032
#define IDS_NETSCAPE_CERT_TYPE 1033
#define IDS_NETSCAPE_BASE_URL 1034
#define IDS_NETSCAPE_REVOCATION_URL 1035
#define IDS_NETSCAPE_CA_REVOCATION_URL 1036
#define IDS_NETSCAPE_CERT_RENEWAL_URL 1037
#define IDS_NETSCAPE_CA_POLICY_URL 1038
#define IDS_NETSCAPE_SSL_SERVER_NAME 1039
#define IDS_NETSCAPE_COMMENT 1040
#define IDS_SPC_SP_AGENCY_INFO 1041
#define IDS_SPC_FINANCIAL_CRITERIA 1042
#define IDS_SPC_MINIMAL_CRITERIA 1043
#define IDS_COUNTRY 1044
#define IDS_ORGANIZATION 1045
#define IDS_ORGANIZATIONAL_UNIT 1046
#define IDS_COMMON_NAME 1047
#define IDS_LOCALITY 1048
#define IDS_STATE_OR_PROVINCE 1049
#define IDS_TITLE 1050
#define IDS_GIVEN_NAME 1051
#define IDS_INITIALS 1052
#define IDS_SUR_NAME 1053
#define IDS_DOMAIN_COMPONENT 1054
#define IDS_STREET_ADDRESS 1055
#define IDS_SERIAL_NUMBER 1056
#define IDS_CA_VERSION 1057
#define IDS_CROSS_CA_VERSION 1058
#define IDS_SERIALIZED_SIG_SERIAL_NUMBER 1059
#define IDS_PRINCIPAL_NAME 1060
#define IDS_WINDOWS_PRODUCT_UPDATE 1061
#define IDS_ENROLLMENT_NAME_VALUE_PAIR 1062
#define IDS_OS_VERSION 1063
#define IDS_ENROLLMENT_CSP 1064
#define IDS_CRL_NUMBER 1065
#define IDS_DELTA_CRL_INDICATOR 1066
#define IDS_ISSUING_DIST_POINT 1067
#define IDS_FRESHEST_CRL 1068
#define IDS_NAME_CONSTRAINTS 1069
#define IDS_POLICY_MAPPINGS 1070
#define IDS_POLICY_CONSTRAINTS 1071
#define IDS_CROSS_CERT_DIST_POINTS 1072
#define IDS_APPLICATION_POLICIES 1073
#define IDS_APPLICATION_POLICY_MAPPINGS 1074
#define IDS_APPLICATION_POLICY_CONSTRAINTS 1075
#define IDS_CMC_DATA 1076
#define IDS_CMC_RESPONSE 1077
#define IDS_UNSIGNED_CMC_REQUEST 1078
#define IDS_CMC_STATUS_INFO 1079
#define IDS_CMC_EXTENSIONS 1080
#define IDS_CMC_ATTRIBUTES 1081
#define IDS_PKCS_7_DATA 1082
#define IDS_PKCS_7_SIGNED 1083
#define IDS_PKCS_7_ENVELOPED 1084
#define IDS_PKCS_7_SIGNED_ENVELOPED 1085
#define IDS_PKCS_7_DIGESTED 1086
#define IDS_PKCS_7_ENCRYPTED 1087
#define IDS_PREVIOUS_CA_CERT_HASH 1088
#define IDS_CRL_VIRTUAL_BASE 1089
#define IDS_CRL_NEXT_PUBLISH 1090
#define IDS_CA_EXCHANGE 1091
#define IDS_KEY_RECOVERY_AGENT 1092
#define IDS_CERTIFICATE_TEMPLATE 1093
#define IDS_ENTERPRISE_ROOT_OID 1094
#define IDS_RDN_DUMMY_SIGNER 1095
#define IDS_ARCHIVED_KEY_ATTR 1096
#define IDS_CRL_SELF_CDP 1097
#define IDS_REQUIRE_CERT_CHAIN_POLICY 1098
#define IDS_TRANSACTION_ID 1099
#define IDS_SENDER_NONCE 1100
#define IDS_RECIPIENT_NONCE 1101
#define IDS_REG_INFO 1102
#define IDS_GET_CERTIFICATE 1103
#define IDS_GET_CRL 1104
#define IDS_REVOKE_REQUEST 1105
#define IDS_QUERY_PENDING 1106
#define IDS_SORTED_CTL 1107
#define IDS_ARCHIVED_KEY_CERT_HASH 1108
#define IDS_PRIVATE_KEY_USAGE_PERIOD 1109
#define IDS_CLIENT_INFORMATION 1110
#define IDS_SERVER_AUTHENTICATION 1111
#define IDS_CLIENT_AUTHENTICATION 1112
#define IDS_CODE_SIGNING 1113
#define IDS_SECURE_EMAIL 1114
#define IDS_TIME_STAMPING 1115
#define IDS_MICROSOFT_TRUST_LIST_SIGNING 1116
#define IDS_MICROSOFT_TIME_STAMPING 1117
#define IDS_IPSEC_END_SYSTEM 1118
#define IDS_IPSEC_TUNNEL 1119
#define IDS_IPSEC_USER 1120
#define IDS_EFS 1121
#define IDS_WHQL_CRYPTO 1122
#define IDS_NT5_CRYPTO 1123
#define IDS_OEM_WHQL_CRYPTO 1124
#define IDS_EMBEDDED_NT_CRYPTO 1125
#define IDS_KEY_PACK_LICENSES 1126
#define IDS_LICENSE_SERVER 1127
#define IDS_SMART_CARD_LOGON 1128
#define IDS_DIGITAL_RIGHTS 1129
#define IDS_QUALIFIED_SUBORDINATION 1130
#define IDS_KEY_RECOVERY 1131
#define IDS_DOCUMENT_SIGNING 1132
#define IDS_IPSEC_IKE_INTERMEDIATE 1133
#define IDS_FILE_RECOVERY 1134
#define IDS_ROOT_LIST_SIGNER 1135
#define IDS_ANY_APPLICATION_POLICIES 1136
#define IDS_DS_EMAIL_REPLICATION 1137
#define IDS_ENROLLMENT_AGENT 1138
#define IDS_LIFETIME_SIGNING 1139
#define IDS_ANY_CERT_POLICY 1140
#endif /* ndef __WINE_CRYPTRES_H__ */

View file

@ -30,6 +30,10 @@
* MSDN, especially:
* http://msdn.microsoft.com/library/en-us/seccrypto/security/constants_for_cryptencodeobject_and_cryptdecodeobject.asp
*/
#include "config.h"
#include "wine/port.h"
#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
@ -66,6 +70,12 @@
WINE_DEFAULT_DEBUG_CHANNEL(crypt);
struct GenericArray
{
DWORD cItems;
BYTE *rgItems;
};
typedef BOOL (WINAPI *CryptEncodeObjectFunc)(DWORD, LPCSTR, const void *,
BYTE *, DWORD *);
typedef BOOL (WINAPI *CryptEncodeObjectExFunc)(DWORD, LPCSTR, const void *,
@ -80,10 +90,6 @@ typedef BOOL (WINAPI *CryptDecodeObjectExFunc)(DWORD, LPCSTR, const BYTE *,
* built-in functions, but the parameters are retained to simplify
* CryptEncodeObjectEx/CryptDecodeObjectEx, since they must call functions in
* external DLLs that follow these signatures.
* FIXME: some built-in functions are suitable to be called directly by
* CryptEncodeObjectEx/CryptDecodeObjectEx (they implement exception handling
* and memory allocation if requested), others are only suitable to be called
* internally. Comment which are which.
*/
static BOOL WINAPI CRYPT_AsnEncodeOid(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
@ -91,6 +97,9 @@ static BOOL WINAPI CRYPT_AsnEncodeOid(DWORD dwCertEncodingType,
static BOOL WINAPI CRYPT_AsnEncodeExtensions(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded);
static BOOL WINAPI CRYPT_AsnEncodeSequenceOfAny(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded);
static BOOL WINAPI CRYPT_AsnEncodeBool(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded);
@ -122,7 +131,7 @@ static BOOL WINAPI CRYPT_AsnEncodeChoiceOfTime(DWORD dwCertEncodingType,
static BOOL WINAPI CRYPT_AsnDecodeChoiceOfTime(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo);
static BOOL WINAPI CRYPT_AsnDecodePubKeyInfo(DWORD dwCertEncodingType,
static BOOL WINAPI CRYPT_AsnDecodePubKeyInfoInternal(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo);
/* Like CRYPT_AsnDecodeExtensions, except assumes rgExtension is set ahead of
@ -1442,6 +1451,46 @@ static BOOL WINAPI CRYPT_AsnEncodeAltName(DWORD dwCertEncodingType,
return ret;
}
static BOOL WINAPI CRYPT_AsnEncodeBasicConstraints(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)
{
BOOL ret;
__TRY
{
const CERT_BASIC_CONSTRAINTS_INFO *info =
(const CERT_BASIC_CONSTRAINTS_INFO *)pvStructInfo;
struct AsnEncodeSequenceItem items[3] = {
{ &info->SubjectType, CRYPT_AsnEncodeBits, 0 },
{ 0 }
};
DWORD cItem = 1;
if (info->fPathLenConstraint)
{
items[cItem].pvStructInfo = &info->dwPathLenConstraint;
items[cItem].encodeFunc = CRYPT_AsnEncodeInt;
cItem++;
}
if (info->cSubtreesConstraint)
{
items[cItem].pvStructInfo = &info->cSubtreesConstraint;
items[cItem].encodeFunc = CRYPT_AsnEncodeSequenceOfAny;
cItem++;
}
ret = CRYPT_AsnEncodeSequence(dwCertEncodingType, items, cItem,
dwFlags, pEncodePara, pbEncoded, pcbEncoded);
}
__EXCEPT_PAGE_FAULT
{
SetLastError(STATUS_ACCESS_VIOLATION);
ret = FALSE;
}
__ENDTRY
return ret;
}
static BOOL WINAPI CRYPT_AsnEncodeBasicConstraints2(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)
@ -2191,6 +2240,70 @@ static BOOL WINAPI CRYPT_AsnEncodeCRLDistPoints(DWORD dwCertEncodingType,
return ret;
}
static BOOL WINAPI CRYPT_AsnEncodeEnhancedKeyUsage(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags,
PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded)
{
BOOL ret;
__TRY
{
const CERT_ENHKEY_USAGE *usage =
(const CERT_ENHKEY_USAGE *)pvStructInfo;
DWORD bytesNeeded = 0, lenBytes, size, i;
ret = TRUE;
for (i = 0; ret && i < usage->cUsageIdentifier; i++)
{
ret = CRYPT_AsnEncodeOid(dwCertEncodingType, NULL,
usage->rgpszUsageIdentifier[i],
dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, NULL, NULL, &size);
if (ret)
bytesNeeded += size;
}
CRYPT_EncodeLen(bytesNeeded, NULL, &lenBytes);
bytesNeeded += 1 + lenBytes;
if (ret)
{
if (!pbEncoded)
*pcbEncoded = bytesNeeded;
else
{
if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara,
pbEncoded, pcbEncoded, bytesNeeded)))
{
if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)
pbEncoded = *(BYTE **)pbEncoded;
*pbEncoded++ = ASN_SEQUENCEOF;
CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, pbEncoded,
&lenBytes);
pbEncoded += lenBytes;
for (i = 0; ret && i < usage->cUsageIdentifier; i++)
{
size = bytesNeeded;
ret = CRYPT_AsnEncodeOid(dwCertEncodingType, NULL,
usage->rgpszUsageIdentifier[i],
dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, NULL, pbEncoded,
&size);
if (ret)
{
pbEncoded += size;
bytesNeeded -= size;
}
}
}
}
}
}
__EXCEPT_PAGE_FAULT
{
SetLastError(STATUS_ACCESS_VIOLATION);
ret = FALSE;
}
__ENDTRY
return ret;
}
BOOL WINAPI CryptEncodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara,
void *pvEncoded, DWORD *pcbEncoded)
@ -2244,6 +2357,9 @@ BOOL WINAPI CryptEncodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
case (WORD)X509_ALTERNATE_NAME:
encodeFunc = CRYPT_AsnEncodeAltName;
break;
case (WORD)X509_BASIC_CONSTRAINTS:
encodeFunc = CRYPT_AsnEncodeBasicConstraints;
break;
case (WORD)X509_BASIC_CONSTRAINTS2:
encodeFunc = CRYPT_AsnEncodeBasicConstraints2;
break;
@ -2281,6 +2397,9 @@ BOOL WINAPI CryptEncodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
case (WORD)X509_CRL_DIST_POINTS:
encodeFunc = CRYPT_AsnEncodeCRLDistPoints;
break;
case (WORD)X509_ENHANCED_KEY_USAGE:
encodeFunc = CRYPT_AsnEncodeEnhancedKeyUsage;
break;
default:
FIXME("%d: unimplemented\n", LOWORD(lpszStructType));
}
@ -2295,6 +2414,8 @@ BOOL WINAPI CryptEncodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
encodeFunc = CRYPT_AsnEncodeBits;
else if (!strcmp(lpszStructType, szOID_SUBJECT_KEY_IDENTIFIER))
encodeFunc = CRYPT_AsnEncodeOctets;
else if (!strcmp(lpszStructType, szOID_BASIC_CONSTRAINTS))
encodeFunc = CRYPT_AsnEncodeBasicConstraints;
else if (!strcmp(lpszStructType, szOID_BASIC_CONSTRAINTS2))
encodeFunc = CRYPT_AsnEncodeBasicConstraints2;
else if (!strcmp(lpszStructType, szOID_ISSUER_ALT_NAME))
@ -2307,6 +2428,10 @@ BOOL WINAPI CryptEncodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
encodeFunc = CRYPT_AsnEncodeAltName;
else if (!strcmp(lpszStructType, szOID_SUBJECT_ALT_NAME2))
encodeFunc = CRYPT_AsnEncodeAltName;
else if (!strcmp(lpszStructType, szOID_CRL_DIST_POINTS))
encodeFunc = CRYPT_AsnEncodeCRLDistPoints;
else if (!strcmp(lpszStructType, szOID_ENHANCED_KEY_USAGE))
encodeFunc = CRYPT_AsnEncodeEnhancedKeyUsage;
else
TRACE("OID %s not found or unimplemented, looking for DLL\n",
debugstr_a(lpszStructType));
@ -2704,12 +2829,6 @@ struct AsnArrayItemSize
DWORD size;
};
struct GenericArray
{
DWORD cItems;
BYTE *rgItems;
};
/* Decodes an array of like types into a struct GenericArray.
* The layout and decoding of the array are described by a struct
* AsnArrayDescriptor.
@ -3063,12 +3182,9 @@ static BOOL WINAPI CRYPT_AsnDecodeCertInfo(DWORD dwCertEncodingType,
{ 0, offsetof(CERT_INFO, Subject), CRYPT_AsnDecodeDerBlob,
sizeof(CRYPT_DER_BLOB), FALSE, TRUE, offsetof(CERT_INFO,
Subject.pbData) },
/* jil FIXME: shouldn't this have an internal version, which expects
* the pbData to be set?
*/
{ ASN_SEQUENCEOF, offsetof(CERT_INFO, SubjectPublicKeyInfo),
CRYPT_AsnDecodePubKeyInfo, sizeof(CERT_PUBLIC_KEY_INFO), FALSE,
TRUE, offsetof(CERT_INFO,
CRYPT_AsnDecodePubKeyInfoInternal, sizeof(CERT_PUBLIC_KEY_INFO),
FALSE, TRUE, offsetof(CERT_INFO,
SubjectPublicKeyInfo.Algorithm.Parameters.pbData), 0 },
{ ASN_BITSTRING, offsetof(CERT_INFO, IssuerUniqueId),
CRYPT_AsnDecodeBitsInternal, sizeof(CRYPT_BIT_BLOB), TRUE, TRUE,
@ -3554,8 +3670,11 @@ static BOOL WINAPI CRYPT_AsnDecodeRdnAttr(DWORD dwCertEncodingType,
sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags, NULL,
attr, pcbStructInfo, attr ? attr->pszObjId : NULL);
if (attr)
{
TRACE("attr->pszObjId is %p (%s)\n", attr->pszObjId,
debugstr_a(attr->pszObjId));
TRACE("attr->dwValueType is %ld\n", attr->dwValueType);
}
TRACE("returning %d (%08lx)\n", ret, GetLastError());
}
__EXCEPT_PAGE_FAULT
@ -3578,9 +3697,10 @@ static BOOL WINAPI CRYPT_AsnDecodeRdn(DWORD dwCertEncodingType,
struct AsnArrayDescriptor arrayDesc = { ASN_CONSTRUCTOR | ASN_SETOF,
CRYPT_AsnDecodeRdnAttr, sizeof(CERT_RDN_ATTR), TRUE,
offsetof(CERT_RDN_ATTR, pszObjId) };
PCERT_RDN rdn = (PCERT_RDN)pvStructInfo;
ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags,
pDecodePara, pvStructInfo, pcbStructInfo, NULL);
pDecodePara, pvStructInfo, pcbStructInfo, rdn ? rdn->rgRDNAttr : NULL);
}
__EXCEPT_PAGE_FAULT
{
@ -3682,14 +3802,11 @@ static BOOL WINAPI CRYPT_AsnDecodeAlgorithmId(DWORD dwCertEncodingType,
return ret;
}
static BOOL WINAPI CRYPT_AsnDecodePubKeyInfo(DWORD dwCertEncodingType,
static BOOL WINAPI CRYPT_AsnDecodePubKeyInfoInternal(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
{
BOOL ret = TRUE;
__TRY
{
struct AsnDecodeSequenceItem items[] = {
{ ASN_SEQUENCEOF, offsetof(CERT_PUBLIC_KEY_INFO, Algorithm),
CRYPT_AsnDecodeAlgorithmId, sizeof(CRYPT_ALGORITHM_IDENTIFIER),
@ -3699,10 +3816,47 @@ static BOOL WINAPI CRYPT_AsnDecodePubKeyInfo(DWORD dwCertEncodingType,
CRYPT_AsnDecodeBitsInternal, sizeof(CRYPT_BIT_BLOB), FALSE, TRUE,
offsetof(CERT_PUBLIC_KEY_INFO, PublicKey.pbData) },
};
PCERT_PUBLIC_KEY_INFO info = (PCERT_PUBLIC_KEY_INFO)pvStructInfo;
ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
pDecodePara, pvStructInfo, pcbStructInfo, NULL);
pDecodePara, pvStructInfo, pcbStructInfo, info ?
info->Algorithm.Parameters.pbData : NULL);
return ret;
}
static BOOL WINAPI CRYPT_AsnDecodePubKeyInfo(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
{
BOOL ret = TRUE;
__TRY
{
DWORD bytesNeeded;
if ((ret = CRYPT_AsnDecodePubKeyInfoInternal(dwCertEncodingType,
lpszStructType, pbEncoded, cbEncoded,
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, NULL, &bytesNeeded)))
{
if (!pvStructInfo)
*pcbStructInfo = bytesNeeded;
else if ((ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara,
pvStructInfo, pcbStructInfo, bytesNeeded)))
{
PCERT_PUBLIC_KEY_INFO info;
if (dwFlags & CRYPT_DECODE_ALLOC_FLAG)
pvStructInfo = *(BYTE **)pvStructInfo;
info = (PCERT_PUBLIC_KEY_INFO)pvStructInfo;
info->Algorithm.Parameters.pbData = (BYTE *)pvStructInfo +
sizeof(CERT_PUBLIC_KEY_INFO);
ret = CRYPT_AsnDecodePubKeyInfoInternal(dwCertEncodingType,
lpszStructType, pbEncoded, cbEncoded,
dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, pvStructInfo,
&bytesNeeded);
}
}
}
__EXCEPT_PAGE_FAULT
{
@ -3958,6 +4112,60 @@ static BOOL WINAPI CRYPT_AsnDecodePathLenConstraint(DWORD dwCertEncodingType,
return ret;
}
static BOOL WINAPI CRYPT_AsnDecodeSubtreeConstraints(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
{
BOOL ret;
struct AsnArrayDescriptor arrayDesc = { ASN_SEQUENCEOF,
CRYPT_AsnDecodeCopyBytes, sizeof(CERT_NAME_BLOB), TRUE,
offsetof(CERT_NAME_BLOB, pbData) };
struct GenericArray *entries = (struct GenericArray *)pvStructInfo;
TRACE("%p, %ld, %08lx, %p, %p, %ld\n", pbEncoded, cbEncoded, dwFlags,
pDecodePara, pvStructInfo, *pcbStructInfo);
ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags,
pDecodePara, pvStructInfo, pcbStructInfo,
entries ? entries->rgItems : NULL);
TRACE("Returning %d (%08lx)\n", ret, GetLastError());
return ret;
}
static BOOL WINAPI CRYPT_AsnDecodeBasicConstraints(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
{
BOOL ret;
__TRY
{
struct AsnDecodeSequenceItem items[] = {
{ ASN_BITSTRING, offsetof(CERT_BASIC_CONSTRAINTS_INFO, SubjectType),
CRYPT_AsnDecodeBitsInternal, sizeof(CRYPT_BIT_BLOB), FALSE, TRUE,
offsetof(CERT_BASIC_CONSTRAINTS_INFO, SubjectType.pbData), 0 },
{ ASN_INTEGER, offsetof(CERT_BASIC_CONSTRAINTS_INFO,
fPathLenConstraint), CRYPT_AsnDecodePathLenConstraint,
sizeof(struct PATH_LEN_CONSTRAINT), TRUE, FALSE, 0, 0 },
{ ASN_SEQUENCEOF, offsetof(CERT_BASIC_CONSTRAINTS_INFO,
cSubtreesConstraint), CRYPT_AsnDecodeSubtreeConstraints,
sizeof(struct GenericArray), TRUE, TRUE,
offsetof(CERT_BASIC_CONSTRAINTS_INFO, rgSubtreesConstraint), 0 },
};
ret = CRYPT_AsnDecodeSequence(dwCertEncodingType, items,
sizeof(items) / sizeof(items[0]), pbEncoded, cbEncoded, dwFlags,
pDecodePara, pvStructInfo, pcbStructInfo, NULL);
}
__EXCEPT_PAGE_FAULT
{
SetLastError(STATUS_ACCESS_VIOLATION);
ret = FALSE;
}
__ENDTRY
return ret;
}
static BOOL WINAPI CRYPT_AsnDecodeBasicConstraints2(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
@ -5043,6 +5251,32 @@ static BOOL WINAPI CRYPT_AsnDecodeCRLDistPoints(DWORD dwCertEncodingType,
return ret;
}
static BOOL WINAPI CRYPT_AsnDecodeEnhancedKeyUsage(DWORD dwCertEncodingType,
LPCSTR lpszStructType, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
{
BOOL ret;
TRACE("%p, %ld, %08lx, %p, %p, %ld\n", pbEncoded, cbEncoded, dwFlags,
pDecodePara, pvStructInfo, *pcbStructInfo);
__TRY
{
struct AsnArrayDescriptor arrayDesc = { ASN_SEQUENCEOF,
CRYPT_AsnDecodeOidWrapper, sizeof(LPSTR), TRUE, 0 };
ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags,
pDecodePara, pvStructInfo, pcbStructInfo, NULL);
}
__EXCEPT_PAGE_FAULT
{
SetLastError(STATUS_ACCESS_VIOLATION);
ret = FALSE;
}
__ENDTRY
return ret;
}
BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags,
PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo)
@ -5106,6 +5340,9 @@ BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
case (WORD)X509_ALTERNATE_NAME:
decodeFunc = CRYPT_AsnDecodeAltName;
break;
case (WORD)X509_BASIC_CONSTRAINTS:
decodeFunc = CRYPT_AsnDecodeBasicConstraints;
break;
case (WORD)X509_BASIC_CONSTRAINTS2:
decodeFunc = CRYPT_AsnDecodeBasicConstraints2;
break;
@ -5143,6 +5380,9 @@ BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
case (WORD)X509_CRL_DIST_POINTS:
decodeFunc = CRYPT_AsnDecodeCRLDistPoints;
break;
case (WORD)X509_ENHANCED_KEY_USAGE:
decodeFunc = CRYPT_AsnDecodeEnhancedKeyUsage;
break;
default:
FIXME("%d: unimplemented\n", LOWORD(lpszStructType));
}
@ -5157,6 +5397,8 @@ BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
decodeFunc = CRYPT_AsnDecodeBits;
else if (!strcmp(lpszStructType, szOID_SUBJECT_KEY_IDENTIFIER))
decodeFunc = CRYPT_AsnDecodeOctets;
else if (!strcmp(lpszStructType, szOID_BASIC_CONSTRAINTS))
decodeFunc = CRYPT_AsnDecodeBasicConstraints;
else if (!strcmp(lpszStructType, szOID_BASIC_CONSTRAINTS2))
decodeFunc = CRYPT_AsnDecodeBasicConstraints2;
else if (!strcmp(lpszStructType, szOID_ISSUER_ALT_NAME))
@ -5169,6 +5411,10 @@ BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType,
decodeFunc = CRYPT_AsnDecodeAltName;
else if (!strcmp(lpszStructType, szOID_SUBJECT_ALT_NAME2))
decodeFunc = CRYPT_AsnDecodeAltName;
else if (!strcmp(lpszStructType, szOID_CRL_DIST_POINTS))
decodeFunc = CRYPT_AsnDecodeCRLDistPoints;
else if (!strcmp(lpszStructType, szOID_ENHANCED_KEY_USAGE))
decodeFunc = CRYPT_AsnDecodeEnhancedKeyUsage;
else
TRACE("OID %s not found or unimplemented, looking for DLL\n",
debugstr_a(lpszStructType));

View file

@ -39,10 +39,11 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
CRYPT_InitFunctionSets();
DisableThreadLibraryCalls(hInstance);
crypt_oid_init(hInstance);
break;
case DLL_PROCESS_DETACH:
CRYPT_FreeFunctionSets();
crypt_oid_free();
if (hDefProv) CryptReleaseContext(hDefProv, 0);
break;
}
@ -217,96 +218,6 @@ BOOL WINAPI CryptSIPLoad
return FALSE;
}
struct OIDToAlgID
{
LPCSTR oid;
DWORD algID;
};
static const struct OIDToAlgID oidToAlgID[] = {
{ szOID_RSA_RSA, CALG_RSA_KEYX },
{ szOID_RSA_MD2RSA, CALG_MD2 },
{ szOID_RSA_MD4RSA, CALG_MD4 },
{ szOID_RSA_MD5RSA, CALG_MD5 },
{ szOID_RSA_SHA1RSA, CALG_SHA },
{ szOID_RSA_DH, CALG_DH_SF },
{ szOID_RSA_SMIMEalgESDH, CALG_DH_EPHEM },
{ szOID_RSA_SMIMEalgCMS3DESwrap, CALG_3DES },
{ szOID_RSA_SMIMEalgCMSRC2wrap, CALG_RC2 },
{ szOID_RSA_MD2, CALG_MD2 },
{ szOID_RSA_MD4, CALG_MD4 },
{ szOID_RSA_MD5, CALG_MD5 },
{ szOID_RSA_RC2CBC, CALG_RC2 },
{ szOID_RSA_RC4, CALG_RC4 },
{ szOID_RSA_DES_EDE3_CBC, CALG_3DES },
{ szOID_ANSI_X942_DH, CALG_DH_SF },
{ szOID_X957_DSA, CALG_DSS_SIGN },
{ szOID_X957_SHA1DSA, CALG_SHA },
{ szOID_OIWSEC_md4RSA, CALG_MD4 },
{ szOID_OIWSEC_md5RSA, CALG_MD5 },
{ szOID_OIWSEC_md4RSA2, CALG_MD4 },
{ szOID_OIWSEC_desCBC, CALG_DES },
{ szOID_OIWSEC_dsa, CALG_DSS_SIGN },
{ szOID_OIWSEC_shaDSA, CALG_SHA },
{ szOID_OIWSEC_shaRSA, CALG_SHA },
{ szOID_OIWSEC_sha, CALG_SHA },
{ szOID_OIWSEC_rsaXchg, CALG_RSA_KEYX },
{ szOID_OIWSEC_sha1, CALG_SHA },
{ szOID_OIWSEC_dsaSHA1, CALG_SHA },
{ szOID_OIWSEC_sha1RSASign, CALG_SHA },
{ szOID_OIWDIR_md2RSA, CALG_MD2 },
{ szOID_INFOSEC_mosaicUpdatedSig, CALG_SHA },
{ szOID_INFOSEC_mosaicKMandUpdSig, CALG_DSS_SIGN },
};
LPCSTR WINAPI CertAlgIdToOID(DWORD dwAlgId)
{
switch (dwAlgId)
{
case CALG_RSA_KEYX:
return szOID_RSA_RSA;
case CALG_DH_EPHEM:
return szOID_RSA_SMIMEalgESDH;
case CALG_MD2:
return szOID_RSA_MD2;
case CALG_MD4:
return szOID_RSA_MD4;
case CALG_MD5:
return szOID_RSA_MD5;
case CALG_RC2:
return szOID_RSA_RC2CBC;
case CALG_RC4:
return szOID_RSA_RC4;
case CALG_3DES:
return szOID_RSA_DES_EDE3_CBC;
case CALG_DH_SF:
return szOID_ANSI_X942_DH;
case CALG_DSS_SIGN:
return szOID_X957_DSA;
case CALG_DES:
return szOID_OIWSEC_desCBC;
case CALG_SHA:
return szOID_OIWSEC_sha1;
default:
return NULL;
}
}
DWORD WINAPI CertOIDToAlgId(LPCSTR pszObjId)
{
int i;
if (pszObjId)
{
for (i = 0; i < sizeof(oidToAlgID) / sizeof(oidToAlgID[0]); i++)
{
if (!strcmp(pszObjId, oidToAlgID[i].oid))
return oidToAlgID[i].algID;
}
}
return 0;
}
LPVOID WINAPI CryptMemAlloc(ULONG cbSize)
{
return HeapAlloc(GetProcessHeap(), 0, cbSize);
@ -351,3 +262,44 @@ BOOL WINAPI I_CryptFreeTls(DWORD dwTlsIndex, DWORD unknown)
TRACE("(%ld, %ld)\n", dwTlsIndex, unknown);
return TlsFree(dwTlsIndex);
}
BOOL WINAPI I_CryptGetOssGlobal(DWORD x)
{
FIXME("%08lx\n", x);
return FALSE;
}
BOOL WINAPI I_CryptInstallOssGlobal(DWORD x, DWORD y, DWORD z)
{
FIXME("%08lx %08lx %08lx\n", x, y, z);
return FALSE;
}
BOOL WINAPI I_CryptInstallAsn1Module(void *x, DWORD y, DWORD z)
{
FIXME("%p %08lx %08lx\n", x, y, z);
return TRUE;
}
BOOL WINAPI CryptQueryObject(DWORD dwObjectType, const void* pvObject,
DWORD dwExpectedContentTypeFlags, DWORD dwExpectedFormatTypeFlags,
DWORD dwFlags, DWORD* pdwMsgAndCertEncodingType, DWORD* pdwContentType,
DWORD* pdwFormatType, HCERTSTORE* phCertStore, HCRYPTMSG* phMsg,
const void** ppvContext)
{
FIXME( "%08lx %p %08lx %08lx %08lx %p %p %p %p %p %p", dwObjectType,
pvObject, dwExpectedContentTypeFlags, dwExpectedFormatTypeFlags,
dwFlags, pdwMsgAndCertEncodingType, pdwContentType, pdwFormatType,
phCertStore, phMsg, ppvContext);
return FALSE;
}
BOOL WINAPI CryptVerifyMessageSignature(/*PCRYPT_VERIFY_MESSAGE_PARA*/ void* pVerifyPara,
DWORD dwSignerIndex, const BYTE* pbSignedBlob, DWORD cbSignedBlob,
BYTE* pbDecoded, DWORD* pcbDecoded, PCCERT_CONTEXT* ppSignerCert)
{
FIXME("stub: %p, %ld, %p, %ld, %p, %p, %p\n",
pVerifyPara, dwSignerIndex, pbSignedBlob, cbSignedBlob,
pbDecoded, pcbDecoded, ppSignerCert);
return FALSE;
}

View file

@ -1,6 +1,6 @@
/*
* Copyright 2002 Mike McCormack for CodeWeavers
* Copyright 2005 Juan Lang
* Copyright 2005-2006 Juan Lang
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@ -18,17 +18,38 @@
*/
#include <stdio.h>
#include <stdarg.h>
#define NONAMELESSUNION
#include "windef.h"
#include "winbase.h"
#include "wincrypt.h"
#include "winreg.h"
#include "winuser.h"
#include "wine/debug.h"
#include "wine/list.h"
#include "crypt32_private.h"
#include "cryptres.h"
WINE_DEFAULT_DEBUG_CHANNEL(crypt);
static const WCHAR DllW[] = { 'D','l','l',0 };
static void init_function_sets(void);
static void init_oid_info(HINSTANCE hinst);
static void free_function_sets(void);
static void free_oid_info(void);
void crypt_oid_init(HINSTANCE hinst)
{
init_function_sets();
init_oid_info(hinst);
}
void crypt_oid_free(void)
{
free_function_sets();
free_oid_info();
}
CRITICAL_SECTION funcSetCS;
struct list funcSets;
@ -47,13 +68,13 @@ struct OIDFunction
struct list next;
};
void CRYPT_InitFunctionSets(void)
static void init_function_sets(void)
{
InitializeCriticalSection(&funcSetCS);
list_init(&funcSets);
}
void CRYPT_FreeFunctionSets(void)
static void free_function_sets(void)
{
struct OIDFunctionSet *setCursor, *setNext;
@ -64,7 +85,6 @@ void CRYPT_FreeFunctionSets(void)
list_remove(&setCursor->next);
CryptMemFree(setCursor->name);
CryptMemFree(setCursor);
LIST_FOR_EACH_ENTRY_SAFE(functionCursor, funcNext,
&setCursor->functions, struct OIDFunction, next)
{
@ -72,6 +92,7 @@ void CRYPT_FreeFunctionSets(void)
CryptMemFree(functionCursor);
}
DeleteCriticalSection(&setCursor->cs);
CryptMemFree(setCursor);
}
DeleteCriticalSection(&funcSetCS);
}
@ -556,3 +577,555 @@ BOOL WINAPI CryptSetOIDFunctionValue(DWORD dwEncodingType, LPCSTR pszFuncName,
}
return rc ? FALSE : TRUE;
}
CRITICAL_SECTION oidInfoCS;
struct list oidInfo;
static const WCHAR tripledes[] = { '3','d','e','s',0 };
static const WCHAR cms3deswrap[] = { 'C','M','S','3','D','E','S','w','r','a',
'p',0 };
static const WCHAR cmsrc2wrap[] = { 'C','M','S','R','C','2','w','r','a','p',0 };
static const WCHAR des[] = { 'd','e','s',0 };
static const WCHAR md2[] = { 'm','d','2',0 };
static const WCHAR md4[] = { 'm','d','4',0 };
static const WCHAR md5[] = { 'm','d','5',0 };
static const WCHAR rc2[] = { 'r','c','2',0 };
static const WCHAR rc4[] = { 'r','c','4',0 };
static const WCHAR sha[] = { 's','h','a',0 };
static const WCHAR sha1[] = { 's','h','a','1',0 };
static const WCHAR RSA[] = { 'R','S','A',0 };
static const WCHAR RSA_KEYX[] = { 'R','S','A','_','K','E','Y','X',0 };
static const WCHAR RSA_SIGN[] = { 'R','S','A','_','S','I','G','N',0 };
static const WCHAR DSA[] = { 'D','S','A',0 };
static const WCHAR DSA_SIGN[] = { 'D','S','A','_','S','I','G','N',0 };
static const WCHAR DH[] = { 'D','H',0 };
static const WCHAR DSS[] = { 'D','S','S',0 };
static const WCHAR mosaicKMandUpdSig[] =
{ 'm','o','s','a','i','c','K','M','a','n','d','U','p','d','S','i','g',0 };
static const WCHAR ESDH[] = { 'E','S','D','H',0 };
static const WCHAR NO_SIGN[] = { 'N','O','S','I','G','N',0 };
static const WCHAR dsaSHA1[] = { 'd','s','a','S','H','A','1',0 };
static const WCHAR md2RSA[] = { 'm','d','2','R','S','A',0 };
static const WCHAR md4RSA[] = { 'm','d','4','R','S','A',0 };
static const WCHAR md5RSA[] = { 'm','d','5','R','S','A',0 };
static const WCHAR shaDSA[] = { 's','h','a','D','S','A',0 };
static const WCHAR sha1DSA[] = { 's','h','a','1','D','S','A',0 };
static const WCHAR shaRSA[] = { 's','h','a','R','S','A',0 };
static const WCHAR sha1RSA[] = { 's','h','a','1','R','S','A',0 };
static const WCHAR mosaicUpdatedSig[] =
{ 'm','o','s','a','i','c','U','p','d','a','t','e','d','S','i','g',0 };
static const WCHAR CN[] = { 'C','N',0 };
static const WCHAR L[] = { 'L',0 };
static const WCHAR O[] = { 'O',0 };
static const WCHAR OU[] = { 'O','U',0 };
static const WCHAR E[] = { 'E',0 };
static const WCHAR C[] = { 'C',0 };
static const WCHAR S[] = { 'S',0 };
static const WCHAR ST[] = { 'S','T',0 };
static const WCHAR STREET[] = { 'S','T','R','E','E','T',0 };
static const WCHAR T[] = { 'T',0 };
static const WCHAR Title[] = { 'T','i','t','l','e',0 };
static const WCHAR G[] = { 'G',0 };
static const WCHAR GivenName[] = { 'G','i','v','e','n','N','a','m','e',0 };
static const WCHAR I[] = { 'I',0 };
static const WCHAR Initials[] = { 'I','n','i','t','i','a','l','s',0 };
static const WCHAR SN[] = { 'S','N',0 };
static const WCHAR DC[] = { 'D','C',0 };
static const WCHAR Description[] =
{ 'D','e','s','c','r','i','p','t','i','o','n',0 };
static const WCHAR PostalCode[] = { 'P','o','s','t','a','l','C','o','d','e',0 };
static const WCHAR POBox[] = { 'P','O','B','o','x',0 };
static const WCHAR Phone[] = { 'P','h','o','n','e',0 };
static const WCHAR X21Address[] = { 'X','2','1','A','d','d','r','e','s','s',0 };
static const WCHAR dnQualifier[] =
{ 'd','n','Q','u','a','l','i','f','i','e','r',0 };
static const WCHAR Email[] = { 'E','m','a','i','l',0 };
static const WCHAR GN[] = { 'G','N',0 };
static const DWORD noNullFlag = CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG;
static const DWORD mosaicFlags = CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAG |
CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG;
static const CRYPT_DATA_BLOB noNullBlob = { sizeof(noNullFlag),
(LPBYTE)&noNullFlag };
static const CRYPT_DATA_BLOB mosaicFlagsBlob = { sizeof(mosaicFlags),
(LPBYTE)&mosaicFlags };
static const DWORD rsaSign = CALG_RSA_SIGN;
static const DWORD dssSign[2] = { CALG_DSS_SIGN,
CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG };
static const DWORD mosaicSign[2] = { CALG_DSS_SIGN,
CRYPT_OID_INHIBIT_SIGNATURE_FORMAT_FLAG |
CRYPT_OID_NO_NULL_ALGORITHM_PARA_FLAG };
static const CRYPT_DATA_BLOB rsaSignBlob = { sizeof(rsaSign),
(LPBYTE)&rsaSign };
static const CRYPT_DATA_BLOB dssSignBlob = { sizeof(dssSign),
(LPBYTE)dssSign };
static const CRYPT_DATA_BLOB mosaicSignBlob = { sizeof(mosaicSign),
(LPBYTE)mosaicSign };
static const DWORD ia5String[] = { CERT_RDN_IA5_STRING, 0 };
static const DWORD numericString[] = { CERT_RDN_NUMERIC_STRING, 0 };
static const DWORD printableString[] = { CERT_RDN_PRINTABLE_STRING, 0 };
static const DWORD domainCompTypes[] = { CERT_RDN_IA5_STRING,
CERT_RDN_UTF8_STRING, 0 };
static const CRYPT_DATA_BLOB ia5StringBlob = { sizeof(ia5String),
(LPBYTE)ia5String };
static const CRYPT_DATA_BLOB numericStringBlob = { sizeof(numericString),
(LPBYTE)numericString };
static const CRYPT_DATA_BLOB printableStringBlob = { sizeof(printableString),
(LPBYTE)printableString };
static const CRYPT_DATA_BLOB domainCompTypesBlob = { sizeof(domainCompTypes),
(LPBYTE)domainCompTypes };
struct OIDInfoConstructor {
DWORD dwGroupId;
LPCSTR pszOID;
UINT Algid;
LPCWSTR pwszName;
const CRYPT_DATA_BLOB *blob;
} oidInfoConstructors[] = {
{ 1, szOID_OIWSEC_sha1, CALG_SHA1, sha1, NULL },
{ 1, szOID_OIWSEC_sha1, CALG_SHA1, sha, NULL },
{ 1, szOID_OIWSEC_sha, CALG_SHA, sha, NULL },
{ 1, szOID_RSA_MD5, CALG_MD5, md5, NULL },
{ 1, szOID_RSA_MD4, CALG_MD4, md4, NULL },
{ 1, szOID_RSA_MD2, CALG_MD2, md2, NULL },
{ 2, szOID_OIWSEC_desCBC, CALG_DES, des, NULL },
{ 2, szOID_RSA_DES_EDE3_CBC, CALG_3DES, tripledes, NULL },
{ 2, szOID_RSA_RC2CBC, CALG_RC2, rc2, NULL },
{ 2, szOID_RSA_RC4, CALG_RC4, rc4, NULL },
{ 2, szOID_RSA_SMIMEalgCMS3DESwrap, CALG_3DES, cms3deswrap, NULL },
{ 2, szOID_RSA_SMIMEalgCMSRC2wrap, CALG_RC2, cmsrc2wrap, NULL },
{ 3, szOID_RSA_RSA, CALG_RSA_KEYX, RSA, NULL },
{ 3, szOID_X957_DSA, CALG_DSS_SIGN, DSA, &noNullBlob },
{ 3, szOID_ANSI_X942_DH, CALG_DH_SF, DH, &noNullBlob },
{ 3, szOID_RSA_RSA, CALG_RSA_KEYX, RSA_KEYX, NULL },
{ 3, szOID_RSA_RSA, CALG_RSA_SIGN, RSA, NULL },
{ 3, szOID_RSA_RSA, CALG_RSA_SIGN, RSA_SIGN, NULL },
{ 3, szOID_OIWSEC_dsa, CALG_DSS_SIGN, DSA, &noNullBlob },
{ 3, szOID_OIWSEC_dsa, CALG_DSS_SIGN, DSS, &noNullBlob },
{ 3, szOID_OIWSEC_dsa, CALG_DSS_SIGN, DSA_SIGN, &noNullBlob },
{ 3, szOID_RSA_DH, CALG_DH_SF, DH, &noNullBlob },
{ 3, szOID_OIWSEC_rsaXchg, CALG_RSA_KEYX, RSA_KEYX, NULL },
{ 3, szOID_INFOSEC_mosaicKMandUpdSig, CALG_DSS_SIGN, mosaicKMandUpdSig,
&mosaicFlagsBlob },
{ 3, szOID_RSA_SMIMEalgESDH, CALG_DH_EPHEM, ESDH, &noNullBlob },
{ 3, szOID_PKIX_NO_SIGNATURE, CALG_NO_SIGN, NO_SIGN, NULL },
{ 4, szOID_RSA_SHA1RSA, CALG_SHA1, sha1RSA, &rsaSignBlob },
{ 4, szOID_RSA_MD5RSA, CALG_MD5, md5RSA, &rsaSignBlob },
{ 4, szOID_X957_SHA1DSA, CALG_SHA1, sha1DSA, &dssSignBlob },
{ 4, szOID_OIWSEC_sha1RSASign, CALG_SHA1, sha1RSA, &rsaSignBlob },
{ 4, szOID_OIWSEC_sha1RSASign, CALG_SHA1, shaRSA, &rsaSignBlob },
{ 4, szOID_OIWSEC_shaRSA, CALG_SHA1, shaRSA, &rsaSignBlob },
{ 4, szOID_OIWSEC_md5RSA, CALG_MD5, md5RSA, &rsaSignBlob },
{ 4, szOID_RSA_MD2RSA, CALG_MD2, md2RSA, &rsaSignBlob },
{ 4, szOID_RSA_MD4RSA, CALG_MD4, md4RSA, &rsaSignBlob },
{ 4, szOID_OIWSEC_md4RSA, CALG_MD4, md4RSA, &rsaSignBlob },
{ 4, szOID_OIWSEC_md4RSA2, CALG_MD4, md4RSA, &rsaSignBlob },
{ 4, szOID_OIWDIR_md2RSA, CALG_MD2, md2RSA, &rsaSignBlob },
{ 4, szOID_OIWSEC_shaDSA, CALG_SHA1, sha1DSA, &dssSignBlob },
{ 4, szOID_OIWSEC_shaDSA, CALG_SHA1, shaDSA, &dssSignBlob },
{ 4, szOID_OIWSEC_dsaSHA1, CALG_SHA1, dsaSHA1, &dssSignBlob },
{ 4, szOID_INFOSEC_mosaicUpdatedSig, CALG_SHA1, mosaicUpdatedSig,
&mosaicSignBlob },
{ 5, szOID_COMMON_NAME, 0, CN, NULL },
{ 5, szOID_LOCALITY_NAME, 0, L, NULL },
{ 5, szOID_ORGANIZATION_NAME, 0, O, NULL },
{ 5, szOID_ORGANIZATIONAL_UNIT_NAME, 0, OU, NULL },
{ 5, szOID_RSA_emailAddr, 0, E, &ia5StringBlob },
{ 5, szOID_RSA_emailAddr, 0, Email, &ia5StringBlob },
{ 5, szOID_COUNTRY_NAME, 0, C, &printableStringBlob },
{ 5, szOID_STATE_OR_PROVINCE_NAME, 0, S, NULL },
{ 5, szOID_STATE_OR_PROVINCE_NAME, 0, ST, NULL },
{ 5, szOID_STREET_ADDRESS, 0, STREET, NULL },
{ 5, szOID_TITLE, 0, T, NULL },
{ 5, szOID_TITLE, 0, Title, NULL },
{ 5, szOID_GIVEN_NAME, 0, G, NULL },
{ 5, szOID_GIVEN_NAME, 0, GN, NULL },
{ 5, szOID_GIVEN_NAME, 0, GivenName, NULL },
{ 5, szOID_INITIALS, 0, I, NULL },
{ 5, szOID_INITIALS, 0, Initials, NULL },
{ 5, szOID_SUR_NAME, 0, SN, NULL },
{ 5, szOID_DOMAIN_COMPONENT, 0, DC, &domainCompTypesBlob },
{ 5, szOID_DESCRIPTION, 0, Description, NULL },
{ 5, szOID_POSTAL_CODE, 0, PostalCode, NULL },
{ 5, szOID_POST_OFFICE_BOX, 0, POBox, NULL },
{ 5, szOID_TELEPHONE_NUMBER, 0, Phone, &printableStringBlob },
{ 5, szOID_X21_ADDRESS, 0, X21Address, &numericStringBlob },
{ 5, szOID_DN_QUALIFIER, 0, dnQualifier, NULL },
{ 6, szOID_AUTHORITY_KEY_IDENTIFIER2, 0, (LPCWSTR)IDS_AUTHORITY_KEY_ID, NULL },
{ 6, szOID_AUTHORITY_KEY_IDENTIFIER, 0, (LPCWSTR)IDS_AUTHORITY_KEY_ID, NULL },
{ 6, szOID_KEY_ATTRIBUTES, 0, (LPCWSTR)IDS_KEY_ATTRIBUTES, NULL },
{ 6, szOID_KEY_USAGE_RESTRICTION, 0, (LPCWSTR)IDS_KEY_USAGE_RESTRICTION, NULL },
{ 6, szOID_SUBJECT_ALT_NAME2, 0, (LPCWSTR)IDS_SUBJECT_ALT_NAME, NULL },
{ 6, szOID_SUBJECT_ALT_NAME, 0, (LPCWSTR)IDS_SUBJECT_ALT_NAME, NULL },
{ 6, szOID_ISSUER_ALT_NAME2, 0, (LPCWSTR)IDS_ISSUER_ALT_NAME, NULL },
{ 6, szOID_ISSUER_ALT_NAME2, 0, (LPCWSTR)IDS_ISSUER_ALT_NAME, NULL },
{ 6, szOID_BASIC_CONSTRAINTS2, 0, (LPCWSTR)IDS_BASIC_CONSTRAINTS, NULL },
{ 6, szOID_BASIC_CONSTRAINTS, 0, (LPCWSTR)IDS_BASIC_CONSTRAINTS, NULL },
{ 6, szOID_KEY_USAGE, 0, (LPCWSTR)IDS_KEY_USAGE, NULL },
{ 6, szOID_CERT_POLICIES, 0, (LPCWSTR)IDS_CERT_POLICIES, NULL },
{ 6, szOID_SUBJECT_KEY_IDENTIFIER, 0, (LPCWSTR)IDS_SUBJECT_KEY_IDENTIFIER, NULL },
{ 6, szOID_CRL_REASON_CODE, 0, (LPCWSTR)IDS_CRL_REASON_CODE, NULL },
{ 6, szOID_CRL_DIST_POINTS, 0, (LPCWSTR)IDS_CRL_DIST_POINTS, NULL },
{ 6, szOID_ENHANCED_KEY_USAGE, 0, (LPCWSTR)IDS_ENHANCED_KEY_USAGE, NULL },
{ 6, szOID_AUTHORITY_INFO_ACCESS, 0, (LPCWSTR)IDS_AUTHORITY_INFO_ACCESS, NULL },
{ 6, szOID_CERT_EXTENSIONS, 0, (LPCWSTR)IDS_CERT_EXTENSIONS, NULL },
{ 6, szOID_RSA_certExtensions, 0, (LPCWSTR)IDS_CERT_EXTENSIONS, NULL },
{ 6, szOID_NEXT_UPDATE_LOCATION, 0, (LPCWSTR)IDS_NEXT_UPDATE_LOCATION, NULL },
{ 6, szOID_YESNO_TRUST_ATTR, 0, (LPCWSTR)IDS_YES_OR_NO_TRUST, NULL },
{ 6, szOID_RSA_emailAddr, 0, (LPCWSTR)IDS_EMAIL_ADDRESS, NULL },
{ 6, szOID_RSA_unstructName, 0, (LPCWSTR)IDS_UNSTRUCTURED_NAME, NULL },
{ 6, szOID_RSA_contentType, 0, (LPCWSTR)IDS_CONTENT_TYPE, NULL },
{ 6, szOID_RSA_messageDigest, 0, (LPCWSTR)IDS_MESSAGE_DIGEST, NULL },
{ 6, szOID_RSA_signingTime, 0, (LPCWSTR)IDS_SIGNING_TIME, NULL },
{ 6, szOID_RSA_counterSign, 0, (LPCWSTR)IDS_COUNTER_SIGN, NULL },
{ 6, szOID_RSA_challengePwd, 0, (LPCWSTR)IDS_CHALLENGE_PASSWORD, NULL },
{ 6, szOID_RSA_unstructAddr, 0, (LPCWSTR)IDS_UNSTRUCTURED_ADDRESS, NULL },
{ 6, szOID_RSA_SMIMECapabilities, 0, (LPCWSTR)IDS_SMIME_CAPABILITIES, NULL },
{ 6, szOID_RSA_preferSignedData, 0, (LPCWSTR)IDS_PREFER_SIGNED_DATA, NULL },
{ 6, szOID_PKIX_POLICY_QUALIFIER_CPS, 0, (LPCWSTR)IDS_CPS, NULL },
{ 6, szOID_PKIX_POLICY_QUALIFIER_USERNOTICE, 0, (LPCWSTR)IDS_USER_NOTICE, NULL },
{ 6, szOID_PKIX_OCSP, 0, (LPCWSTR)IDS_OCSP, NULL },
{ 6, szOID_PKIX_CA_ISSUERS, 0, (LPCWSTR)IDS_CA_ISSUER, NULL },
{ 6, szOID_ENROLL_CERTTYPE_EXTENSION, 0, (LPCWSTR)IDS_CERT_TEMPLATE_NAME, NULL },
{ 6, szOID_ENROLL_CERTTYPE_EXTENSION, 0, (LPCWSTR)IDS_CERT_TYPE, NULL },
{ 6, szOID_CERT_MANIFOLD, 0, (LPCWSTR)IDS_CERT_MANIFOLD, NULL },
{ 6, szOID_NETSCAPE_CERT_TYPE, 0, (LPCWSTR)IDS_NETSCAPE_CERT_TYPE, NULL },
{ 6, szOID_NETSCAPE_BASE_URL, 0, (LPCWSTR)IDS_NETSCAPE_BASE_URL, NULL },
{ 6, szOID_NETSCAPE_REVOCATION_URL, 0, (LPCWSTR)IDS_NETSCAPE_REVOCATION_URL, NULL },
{ 6, szOID_NETSCAPE_CA_REVOCATION_URL, 0, (LPCWSTR)IDS_NETSCAPE_CA_REVOCATION_URL, NULL },
{ 6, szOID_NETSCAPE_CERT_RENEWAL_URL, 0, (LPCWSTR)IDS_NETSCAPE_CERT_RENEWAL_URL, NULL },
{ 6, szOID_NETSCAPE_CA_POLICY_URL, 0, (LPCWSTR)IDS_NETSCAPE_CA_POLICY_URL, NULL },
{ 6, szOID_NETSCAPE_SSL_SERVER_NAME, 0, (LPCWSTR)IDS_NETSCAPE_SSL_SERVER_NAME, NULL },
{ 6, szOID_NETSCAPE_COMMENT, 0, (LPCWSTR)IDS_NETSCAPE_COMMENT, NULL },
{ 6, "1.3.6.1.4.1.311.2.1.10", 0, (LPCWSTR)IDS_SPC_SP_AGENCY_INFO, NULL },
{ 6, "1.3.6.1.4.1.311.2.1.27", 0, (LPCWSTR)IDS_SPC_FINANCIAL_CRITERIA, NULL },
{ 6, "1.3.6.1.4.1.311.2.1.26", 0, (LPCWSTR)IDS_SPC_MINIMAL_CRITERIA, NULL },
{ 6, szOID_COUNTRY_NAME, 0, (LPCWSTR)IDS_COUNTRY, NULL },
{ 6, szOID_ORGANIZATION_NAME, 0, (LPCWSTR)IDS_ORGANIZATION, NULL },
{ 6, szOID_ORGANIZATIONAL_UNIT_NAME, 0, (LPCWSTR)IDS_ORGANIZATIONAL_UNIT, NULL },
{ 6, szOID_COMMON_NAME, 0, (LPCWSTR)IDS_COMMON_NAME, NULL },
{ 6, szOID_LOCALITY_NAME, 0, (LPCWSTR)IDS_LOCALITY, NULL },
{ 6, szOID_STATE_OR_PROVINCE_NAME, 0, (LPCWSTR)IDS_STATE_OR_PROVINCE, NULL },
{ 6, szOID_TITLE, 0, (LPCWSTR)IDS_TITLE, NULL },
{ 6, szOID_GIVEN_NAME, 0, (LPCWSTR)IDS_GIVEN_NAME, NULL },
{ 6, szOID_INITIALS, 0, (LPCWSTR)IDS_INITIALS, NULL },
{ 6, szOID_SUR_NAME, 0, (LPCWSTR)IDS_SUR_NAME, NULL },
{ 6, szOID_DOMAIN_COMPONENT, 0, (LPCWSTR)IDS_DOMAIN_COMPONENT, NULL },
{ 6, szOID_STREET_ADDRESS, 0, (LPCWSTR)IDS_STREET_ADDRESS, NULL },
{ 6, szOID_DEVICE_SERIAL_NUMBER, 0, (LPCWSTR)IDS_SERIAL_NUMBER, NULL },
{ 6, szOID_CERTSRV_CA_VERSION, 0, (LPCWSTR)IDS_CA_VERSION, NULL },
{ 6, szOID_CERTSRV_CROSSCA_VERSION, 0, (LPCWSTR)IDS_CROSS_CA_VERSION, NULL },
{ 6, szOID_SERIALIZED, 0, (LPCWSTR)IDS_SERIALIZED_SIG_SERIAL_NUMBER, NULL },
{ 6, szOID_NT_PRINCIPAL_NAME, 0, (LPCWSTR)IDS_PRINCIPAL_NAME, NULL },
{ 6, szOID_PRODUCT_UPDATE, 0, (LPCWSTR)IDS_WINDOWS_PRODUCT_UPDATE, NULL },
{ 6, szOID_ENROLLMENT_NAME_VALUE_PAIR, 0, (LPCWSTR)IDS_ENROLLMENT_NAME_VALUE_PAIR, NULL },
{ 6, szOID_OS_VERSION, 0, (LPCWSTR)IDS_OS_VERSION, NULL },
{ 6, szOID_ENROLLMENT_CSP_PROVIDER, 0, (LPCWSTR)IDS_ENROLLMENT_CSP, NULL },
{ 6, szOID_CRL_NUMBER, 0, (LPCWSTR)IDS_CRL_NUMBER, NULL },
{ 6, szOID_DELTA_CRL_INDICATOR, 0, (LPCWSTR)IDS_DELTA_CRL_INDICATOR, NULL },
{ 6, szOID_ISSUING_DIST_POINT, 0, (LPCWSTR)IDS_ISSUING_DIST_POINT, NULL },
{ 6, szOID_FRESHEST_CRL, 0, (LPCWSTR)IDS_FRESHEST_CRL, NULL },
{ 6, szOID_NAME_CONSTRAINTS, 0, (LPCWSTR)IDS_NAME_CONSTRAINTS, NULL },
{ 6, szOID_POLICY_MAPPINGS, 0, (LPCWSTR)IDS_POLICY_MAPPINGS, NULL },
{ 6, szOID_LEGACY_POLICY_MAPPINGS, 0, (LPCWSTR)IDS_POLICY_MAPPINGS, NULL },
{ 6, szOID_POLICY_CONSTRAINTS, 0, (LPCWSTR)IDS_POLICY_CONSTRAINTS, NULL },
{ 6, szOID_CROSS_CERT_DIST_POINTS, 0, (LPCWSTR)IDS_CROSS_CERT_DIST_POINTS, NULL },
{ 6, szOID_APPLICATION_CERT_POLICIES, 0, (LPCWSTR)IDS_APPLICATION_POLICIES, NULL },
{ 6, szOID_APPLICATION_POLICY_MAPPINGS, 0, (LPCWSTR)IDS_APPLICATION_POLICY_MAPPINGS, NULL },
{ 6, szOID_APPLICATION_POLICY_CONSTRAINTS, 0, (LPCWSTR)IDS_APPLICATION_POLICY_CONSTRAINTS, NULL },
{ 6, szOID_CT_PKI_DATA, 0, (LPCWSTR)IDS_CMC_DATA, NULL },
{ 6, szOID_CT_PKI_RESPONSE, 0, (LPCWSTR)IDS_CMC_RESPONSE, NULL },
{ 6, szOID_CMC, 0, (LPCWSTR)IDS_UNSIGNED_CMC_REQUEST, NULL },
{ 6, szOID_CMC_STATUS_INFO, 0, (LPCWSTR)IDS_CMC_STATUS_INFO, NULL },
{ 6, szOID_CMC_ADD_EXTENSIONS, 0, (LPCWSTR)IDS_CMC_EXTENSIONS, NULL },
{ 6, szOID_CTL, 0, (LPCWSTR)IDS_CMC_ATTRIBUTES, NULL },
{ 6, szOID_RSA_data, 0, (LPCWSTR)IDS_PKCS_7_DATA, NULL },
{ 6, szOID_RSA_signedData, 0, (LPCWSTR)IDS_PKCS_7_SIGNED, NULL },
{ 6, szOID_RSA_envelopedData, 0, (LPCWSTR)IDS_PKCS_7_ENVELOPED, NULL },
{ 6, szOID_RSA_signEnvData, 0, (LPCWSTR)IDS_PKCS_7_SIGNED_ENVELOPED, NULL },
{ 6, szOID_RSA_digestedData, 0, (LPCWSTR)IDS_PKCS_7_DIGESTED, NULL },
{ 6, szOID_RSA_encryptedData, 0, (LPCWSTR)IDS_PKCS_7_ENCRYPTED, NULL },
{ 6, szOID_CERTSRV_PREVIOUS_CERT_HASH, 0, (LPCWSTR)IDS_PREVIOUS_CA_CERT_HASH, NULL },
{ 6, szOID_CRL_VIRTUAL_BASE, 0, (LPCWSTR)IDS_CRL_VIRTUAL_BASE, NULL },
{ 6, szOID_CRL_NEXT_PUBLISH, 0, (LPCWSTR)IDS_CRL_NEXT_PUBLISH, NULL },
{ 6, szOID_KP_CA_EXCHANGE, 0, (LPCWSTR)IDS_CA_EXCHANGE, NULL },
{ 6, szOID_KP_KEY_RECOVERY_AGENT, 0, (LPCWSTR)IDS_KEY_RECOVERY_AGENT, NULL },
{ 6, szOID_CERTIFICATE_TEMPLATE, 0, (LPCWSTR)IDS_CERTIFICATE_TEMPLATE, NULL },
{ 6, szOID_ENTERPRISE_OID_ROOT, 0, (LPCWSTR)IDS_ENTERPRISE_ROOT_OID, NULL },
{ 6, szOID_RDN_DUMMY_SIGNER, 0, (LPCWSTR)IDS_RDN_DUMMY_SIGNER, NULL },
{ 6, szOID_ARCHIVED_KEY_ATTR, 0, (LPCWSTR)IDS_ARCHIVED_KEY_ATTR, NULL },
{ 6, szOID_CRL_SELF_CDP, 0, (LPCWSTR)IDS_CRL_SELF_CDP, NULL },
{ 6, szOID_REQUIRE_CERT_CHAIN_POLICY, 0, (LPCWSTR)IDS_REQUIRE_CERT_CHAIN_POLICY, NULL },
{ 6, szOID_CMC_TRANSACTION_ID, 0, (LPCWSTR)IDS_TRANSACTION_ID, NULL },
{ 6, szOID_CMC_SENDER_NONCE, 0, (LPCWSTR)IDS_SENDER_NONCE, NULL },
{ 6, szOID_CMC_RECIPIENT_NONCE, 0, (LPCWSTR)IDS_RECIPIENT_NONCE, NULL },
{ 6, szOID_CMC_REG_INFO, 0, (LPCWSTR)IDS_REG_INFO, NULL },
{ 6, szOID_CMC_GET_CERT, 0, (LPCWSTR)IDS_GET_CERTIFICATE, NULL },
{ 6, szOID_CMC_GET_CRL, 0, (LPCWSTR)IDS_GET_CRL, NULL },
{ 6, szOID_CMC_REVOKE_REQUEST, 0, (LPCWSTR)IDS_REVOKE_REQUEST, NULL },
{ 6, szOID_CMC_QUERY_PENDING, 0, (LPCWSTR)IDS_QUERY_PENDING, NULL },
{ 6, szOID_SORTED_CTL, 0, (LPCWSTR)IDS_SORTED_CTL, NULL },
{ 6, szOID_ARCHIVED_KEY_CERT_HASH, 0, (LPCWSTR)IDS_ARCHIVED_KEY_CERT_HASH, NULL },
{ 6, szOID_PRIVATEKEY_USAGE_PERIOD, 0, (LPCWSTR)IDS_PRIVATE_KEY_USAGE_PERIOD, NULL },
{ 6, szOID_REQUEST_CLIENT_INFO, 0, (LPCWSTR)IDS_CLIENT_INFORMATION, NULL },
{ 7, szOID_PKIX_KP_SERVER_AUTH, 0, (LPCWSTR)IDS_SERVER_AUTHENTICATION, NULL },
{ 7, szOID_PKIX_KP_CLIENT_AUTH, 0, (LPCWSTR)IDS_CLIENT_AUTHENTICATION, NULL },
{ 7, szOID_PKIX_KP_CODE_SIGNING, 0, (LPCWSTR)IDS_CODE_SIGNING, NULL },
{ 7, szOID_PKIX_KP_EMAIL_PROTECTION, 0, (LPCWSTR)IDS_SECURE_EMAIL, NULL },
{ 7, szOID_PKIX_KP_TIMESTAMP_SIGNING, 0, (LPCWSTR)IDS_TIME_STAMPING, NULL },
{ 7, szOID_KP_CTL_USAGE_SIGNING, 0, (LPCWSTR)IDS_MICROSOFT_TRUST_LIST_SIGNING, NULL },
{ 7, szOID_KP_TIME_STAMP_SIGNING, 0, (LPCWSTR)IDS_MICROSOFT_TIME_STAMPING, NULL },
{ 7, szOID_PKIX_KP_IPSEC_END_SYSTEM, 0, (LPCWSTR)IDS_IPSEC_END_SYSTEM, NULL },
{ 7, szOID_PKIX_KP_IPSEC_TUNNEL, 0, (LPCWSTR)IDS_IPSEC_TUNNEL, NULL },
{ 7, szOID_PKIX_KP_IPSEC_USER, 0, (LPCWSTR)IDS_IPSEC_USER, NULL },
{ 7, szOID_KP_EFS, 0, (LPCWSTR)IDS_EFS, NULL },
{ 7, szOID_WHQL_CRYPTO, 0, (LPCWSTR)IDS_WHQL_CRYPTO, NULL },
{ 7, szOID_NT5_CRYPTO, 0, (LPCWSTR)IDS_NT5_CRYPTO, NULL },
{ 7, szOID_OEM_WHQL_CRYPTO, 0, (LPCWSTR)IDS_OEM_WHQL_CRYPTO, NULL },
{ 7, szOID_EMBEDDED_NT_CRYPTO, 0, (LPCWSTR)IDS_EMBEDDED_NT_CRYPTO, NULL },
{ 7, szOID_LICENSES, 0, (LPCWSTR)IDS_KEY_PACK_LICENSES, NULL },
{ 7, szOID_LICENSE_SERVER, 0, (LPCWSTR)IDS_LICENSE_SERVER, NULL },
{ 7, szOID_KP_SMARTCARD_LOGON, 0, (LPCWSTR)IDS_SMART_CARD_LOGON, NULL },
{ 7, szOID_DRM, 0, (LPCWSTR)IDS_DIGITAL_RIGHTS, NULL },
{ 7, szOID_KP_QUALIFIED_SUBORDINATION, 0, (LPCWSTR)IDS_QUALIFIED_SUBORDINATION, NULL },
{ 7, szOID_KP_KEY_RECOVERY, 0, (LPCWSTR)IDS_KEY_RECOVERY, NULL },
{ 7, szOID_KP_DOCUMENT_SIGNING, 0, (LPCWSTR)IDS_DOCUMENT_SIGNING, NULL },
{ 7, szOID_IPSEC_KP_IKE_INTERMEDIATE, 0, (LPCWSTR)IDS_IPSEC_IKE_INTERMEDIATE, NULL },
{ 7, szOID_EFS_RECOVERY, 0, (LPCWSTR)IDS_FILE_RECOVERY, NULL },
{ 7, szOID_ROOT_LIST_SIGNER, 0, (LPCWSTR)IDS_ROOT_LIST_SIGNER, NULL },
{ 7, szOID_ANY_APPLICATION_POLICY, 0, (LPCWSTR)IDS_ANY_APPLICATION_POLICIES, NULL },
{ 7, szOID_DS_EMAIL_REPLICATION, 0, (LPCWSTR)IDS_DS_EMAIL_REPLICATION, NULL },
{ 7, szOID_ENROLLMENT_AGENT, 0, (LPCWSTR)IDS_ENROLLMENT_AGENT, NULL },
{ 7, szOID_KP_KEY_RECOVERY_AGENT, 0, (LPCWSTR)IDS_KEY_RECOVERY_AGENT, NULL },
{ 7, szOID_KP_CA_EXCHANGE, 0, (LPCWSTR)IDS_CA_EXCHANGE, NULL },
{ 7, szOID_KP_LIFETIME_SIGNING, 0, (LPCWSTR)IDS_LIFETIME_SIGNING, NULL },
{ 8, szOID_ANY_CERT_POLICY, 0, (LPCWSTR)IDS_ANY_CERT_POLICY, NULL },
};
struct OIDInfo {
CRYPT_OID_INFO info;
struct list entry;
};
static void init_oid_info(HINSTANCE hinst)
{
DWORD i;
InitializeCriticalSection(&oidInfoCS);
list_init(&oidInfo);
for (i = 0; i < sizeof(oidInfoConstructors) /
sizeof(oidInfoConstructors[0]); i++)
{
if (HIWORD(oidInfoConstructors[i].pwszName))
{
struct OIDInfo *info;
/* The name is a static string, so just use the same pointer */
info = CryptMemAlloc(sizeof(struct OIDInfo));
if (info)
{
memset(info, 0, sizeof(*info));
info->info.cbSize = sizeof(CRYPT_OID_INFO);
info->info.pszOID = oidInfoConstructors[i].pszOID;
info->info.pwszName = oidInfoConstructors[i].pwszName;
info->info.dwGroupId = oidInfoConstructors[i].dwGroupId;
info->info.u.Algid = oidInfoConstructors[i].Algid;
if (oidInfoConstructors[i].blob)
{
info->info.ExtraInfo.cbData =
oidInfoConstructors[i].blob->cbData;
info->info.ExtraInfo.pbData =
oidInfoConstructors[i].blob->pbData;
}
list_add_tail(&oidInfo, &info->entry);
}
}
else
{
int len = LoadStringW(hinst, (UINT)oidInfoConstructors[i].pwszName,
NULL, 0);
if (len)
{
struct OIDInfo *info = CryptMemAlloc(sizeof(struct OIDInfo) +
(len + 1) * sizeof(WCHAR));
if (info)
{
memset(info, 0, sizeof(*info));
info->info.cbSize = sizeof(CRYPT_OID_INFO);
info->info.pszOID = oidInfoConstructors[i].pszOID;
info->info.pwszName =
(LPWSTR)((LPBYTE)info + sizeof(struct OIDInfo));
info->info.dwGroupId = oidInfoConstructors[i].dwGroupId;
info->info.u.Algid = oidInfoConstructors[i].Algid;
LoadStringW(hinst, (UINT)oidInfoConstructors[i].pwszName,
(LPWSTR)info->info.pwszName, len + 1);
if (oidInfoConstructors[i].blob)
{
info->info.ExtraInfo.cbData =
oidInfoConstructors[i].blob->cbData;
info->info.ExtraInfo.pbData =
oidInfoConstructors[i].blob->pbData;
}
list_add_tail(&oidInfo, &info->entry);
}
}
}
}
}
static void free_oid_info(void)
{
struct OIDInfo *info, *next;
LIST_FOR_EACH_ENTRY_SAFE(info, next, &oidInfo, struct OIDInfo, entry)
{
list_remove(&info->entry);
CryptMemFree(info);
}
DeleteCriticalSection(&oidInfoCS);
}
BOOL WINAPI CryptEnumOIDInfo(DWORD dwGroupId, DWORD dwFlags, void *pvArg,
PFN_CRYPT_ENUM_OID_INFO pfnEnumOIDInfo)
{
BOOL ret = TRUE;
struct OIDInfo *info;
TRACE("(%ld, %08lx, %p, %p)\n", dwGroupId, dwFlags, pvArg,
pfnEnumOIDInfo);
EnterCriticalSection(&oidInfoCS);
LIST_FOR_EACH_ENTRY(info, &oidInfo, struct OIDInfo, entry)
{
if (!dwGroupId || dwGroupId == info->info.dwGroupId)
{
ret = pfnEnumOIDInfo(&info->info, pvArg);
if (!ret)
break;
}
}
LeaveCriticalSection(&oidInfoCS);
return ret;
}
PCCRYPT_OID_INFO WINAPI CryptFindOIDInfo(DWORD dwKeyType, void *pvKey,
DWORD dwGroupId)
{
PCCRYPT_OID_INFO ret = NULL;
TRACE("(%ld, %p, %ld)\n", dwKeyType, pvKey, dwGroupId);
switch(dwKeyType)
{
case CRYPT_OID_INFO_ALGID_KEY:
{
struct OIDInfo *info;
EnterCriticalSection(&oidInfoCS);
LIST_FOR_EACH_ENTRY(info, &oidInfo, struct OIDInfo, entry)
{
if (info->info.u.Algid == *(DWORD *)pvKey &&
(!dwGroupId || info->info.dwGroupId == dwGroupId))
{
ret = &info->info;
break;
}
}
LeaveCriticalSection(&oidInfoCS);
break;
}
case CRYPT_OID_INFO_NAME_KEY:
{
struct OIDInfo *info;
EnterCriticalSection(&oidInfoCS);
LIST_FOR_EACH_ENTRY(info, &oidInfo, struct OIDInfo, entry)
{
if (!lstrcmpW(info->info.pwszName, (LPWSTR)pvKey) &&
(!dwGroupId || info->info.dwGroupId == dwGroupId))
{
ret = &info->info;
break;
}
}
LeaveCriticalSection(&oidInfoCS);
break;
}
case CRYPT_OID_INFO_OID_KEY:
{
struct OIDInfo *info;
LPSTR oid = (LPSTR)pvKey;
EnterCriticalSection(&oidInfoCS);
LIST_FOR_EACH_ENTRY(info, &oidInfo, struct OIDInfo, entry)
{
if (!lstrcmpA(info->info.pszOID, oid) &&
(!dwGroupId || info->info.dwGroupId == dwGroupId))
{
ret = &info->info;
break;
}
}
LeaveCriticalSection(&oidInfoCS);
break;
}
case CRYPT_OID_INFO_SIGN_KEY:
{
struct OIDInfo *info;
EnterCriticalSection(&oidInfoCS);
LIST_FOR_EACH_ENTRY(info, &oidInfo, struct OIDInfo, entry)
{
if (info->info.u.Algid == *(DWORD *)pvKey &&
info->info.ExtraInfo.cbData >= sizeof(DWORD) &&
*(DWORD *)info->info.ExtraInfo.pbData ==
*(DWORD *)((LPBYTE)pvKey + sizeof(DWORD)) &&
(!dwGroupId || info->info.dwGroupId == dwGroupId))
{
ret = &info->info;
break;
}
}
LeaveCriticalSection(&oidInfoCS);
break;
}
}
return ret;
}
LPCSTR WINAPI CertAlgIdToOID(DWORD dwAlgId)
{
LPCSTR ret;
PCCRYPT_OID_INFO info = CryptFindOIDInfo(CRYPT_OID_INFO_ALGID_KEY,
&dwAlgId, 0);
if (info)
ret = info->pszOID;
else
ret = NULL;
return ret;
}
DWORD WINAPI CertOIDToAlgId(LPCSTR pszObjId)
{
DWORD ret;
PCCRYPT_OID_INFO info = CryptFindOIDInfo(CRYPT_OID_INFO_OID_KEY,
(void *)pszObjId, 0);
if (info)
ret = info->u.Algid;
else
ret = 0;
return ret;
}

View file

@ -0,0 +1,215 @@
/*
* Copyright 2004-2006 Juan Lang
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <assert.h>
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "wincrypt.h"
#include "wine/debug.h"
#include "wine/list.h"
#include "crypt32_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(crypt);
typedef struct _CONTEXT_PROPERTY_LIST
{
CRITICAL_SECTION cs;
struct list properties;
} CONTEXT_PROPERTY_LIST;
typedef struct _CONTEXT_PROPERTY
{
DWORD propID;
DWORD cbData;
LPBYTE pbData;
struct list entry;
} CONTEXT_PROPERTY, *PCONTEXT_PROPERTY;
PCONTEXT_PROPERTY_LIST ContextPropertyList_Create(void)
{
PCONTEXT_PROPERTY_LIST list = CryptMemAlloc(sizeof(CONTEXT_PROPERTY_LIST));
if (list)
{
InitializeCriticalSection(&list->cs);
list_init(&list->properties);
}
return list;
}
void ContextPropertyList_Free(PCONTEXT_PROPERTY_LIST list)
{
PCONTEXT_PROPERTY prop, next;
LIST_FOR_EACH_ENTRY_SAFE(prop, next, &list->properties, CONTEXT_PROPERTY,
entry)
{
list_remove(&prop->entry);
CryptMemFree(prop->pbData);
CryptMemFree(prop);
}
DeleteCriticalSection(&list->cs);
CryptMemFree(list);
}
BOOL ContextPropertyList_FindProperty(PCONTEXT_PROPERTY_LIST list, DWORD id,
PCRYPT_DATA_BLOB blob)
{
PCONTEXT_PROPERTY prop;
BOOL ret = FALSE;
TRACE("(%p, %ld, %p)\n", list, id, blob);
EnterCriticalSection(&list->cs);
LIST_FOR_EACH_ENTRY(prop, &list->properties, CONTEXT_PROPERTY, entry)
{
if (prop->propID == id)
{
blob->cbData = prop->cbData;
blob->pbData = prop->pbData;
ret = TRUE;
break;
}
}
LeaveCriticalSection(&list->cs);
return ret;
}
BOOL ContextPropertyList_SetProperty(PCONTEXT_PROPERTY_LIST list, DWORD id,
const BYTE *pbData, size_t cbData)
{
LPBYTE data;
BOOL ret = FALSE;
if (cbData)
{
data = CryptMemAlloc(cbData);
if (data)
memcpy(data, pbData, cbData);
}
else
data = NULL;
if (!cbData || data)
{
PCONTEXT_PROPERTY prop;
BOOL found = FALSE;
EnterCriticalSection(&list->cs);
LIST_FOR_EACH_ENTRY(prop, &list->properties, CONTEXT_PROPERTY, entry)
{
if (prop->propID == id)
{
found = TRUE;
break;
}
}
if (found)
{
CryptMemFree(prop->pbData);
prop->cbData = cbData;
prop->pbData = data;
ret = TRUE;
}
else
{
prop = CryptMemAlloc(sizeof(CONTEXT_PROPERTY));
if (prop)
{
prop->propID = id;
prop->cbData = cbData;
list_init(&prop->entry);
prop->pbData = data;
list_add_tail(&list->properties, &prop->entry);
ret = TRUE;
}
else
CryptMemFree(data);
}
LeaveCriticalSection(&list->cs);
}
return ret;
}
void ContextPropertyList_RemoveProperty(PCONTEXT_PROPERTY_LIST list, DWORD id)
{
PCONTEXT_PROPERTY prop, next;
EnterCriticalSection(&list->cs);
LIST_FOR_EACH_ENTRY_SAFE(prop, next, &list->properties, CONTEXT_PROPERTY,
entry)
{
if (prop->propID == id)
{
list_remove(&prop->entry);
CryptMemFree(prop->pbData);
CryptMemFree(prop);
}
}
LeaveCriticalSection(&list->cs);
}
/* Since the properties are stored in a list, this is a tad inefficient
* (O(n^2)) since I have to find the previous position every time.
*/
DWORD ContextPropertyList_EnumPropIDs(PCONTEXT_PROPERTY_LIST list, DWORD id)
{
DWORD ret;
EnterCriticalSection(&list->cs);
if (id)
{
PCONTEXT_PROPERTY cursor = NULL;
LIST_FOR_EACH_ENTRY(cursor, &list->properties, CONTEXT_PROPERTY, entry)
{
if (cursor->propID == id)
break;
}
if (cursor)
{
if (cursor->entry.next != &list->properties)
ret = LIST_ENTRY(cursor->entry.next, CONTEXT_PROPERTY,
entry)->propID;
else
ret = 0;
}
else
ret = 0;
}
else if (!list_empty(&list->properties))
ret = LIST_ENTRY(list->properties.next, CONTEXT_PROPERTY,
entry)->propID;
else
ret = 0;
LeaveCriticalSection(&list->cs);
return ret;
}
void ContextPropertyList_Copy(PCONTEXT_PROPERTY_LIST to,
PCONTEXT_PROPERTY_LIST from)
{
PCONTEXT_PROPERTY prop;
EnterCriticalSection(&from->cs);
LIST_FOR_EACH_ENTRY(prop, &from->properties, CONTEXT_PROPERTY, entry)
{
ContextPropertyList_SetProperty(to, prop->propID, prop->pbData,
prop->cbData);
}
LeaveCriticalSection(&from->cs);
}

View file

@ -0,0 +1,515 @@
/*
* Copyright 2004-2006 Juan Lang
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "wincrypt.h"
#include "wine/debug.h"
#include "excpt.h"
#include "wine/exception.h"
#include "crypt32_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(crypt);
/* Some typedefs that make it easier to abstract which type of context we're
* working with.
*/
typedef const void *(WINAPI *CreateContextFunc)(DWORD dwCertEncodingType,
const BYTE *pbCertEncoded, DWORD cbCertEncoded);
typedef BOOL (WINAPI *AddContextToStoreFunc)(HCERTSTORE hCertStore,
const void *context, DWORD dwAddDisposition, const void **ppStoreContext);
typedef BOOL (WINAPI *AddEncodedContextToStoreFunc)(HCERTSTORE hCertStore,
DWORD dwCertEncodingType, const BYTE *pbEncoded, DWORD cbEncoded,
DWORD dwAddDisposition, const void **ppContext);
typedef const void *(WINAPI *EnumContextsInStoreFunc)(HCERTSTORE hCertStore,
const void *pPrevContext);
typedef BOOL (WINAPI *GetContextPropertyFunc)(const void *context,
DWORD dwPropID, void *pvData, DWORD *pcbData);
typedef BOOL (WINAPI *SetContextPropertyFunc)(const void *context,
DWORD dwPropID, DWORD dwFlags, const void *pvData);
typedef BOOL (WINAPI *SerializeElementFunc)(const void *context, DWORD dwFlags,
BYTE *pbElement, DWORD *pcbElement);
typedef BOOL (WINAPI *FreeContextFunc)(const void *context);
typedef BOOL (WINAPI *DeleteContextFunc)(const void *context);
/* An abstract context (certificate, CRL, or CTL) interface */
typedef struct _WINE_CONTEXT_INTERFACE
{
CreateContextFunc create;
AddContextToStoreFunc addContextToStore;
AddEncodedContextToStoreFunc addEncodedToStore;
EnumContextsInStoreFunc enumContextsInStore;
GetContextPropertyFunc getProp;
SetContextPropertyFunc setProp;
SerializeElementFunc serialize;
FreeContextFunc free;
DeleteContextFunc deleteFromStore;
} WINE_CONTEXT_INTERFACE, *PWINE_CONTEXT_INTERFACE;
static const WINE_CONTEXT_INTERFACE gCertInterface = {
(CreateContextFunc)CertCreateCertificateContext,
(AddContextToStoreFunc)CertAddCertificateContextToStore,
(AddEncodedContextToStoreFunc)CertAddEncodedCertificateToStore,
(EnumContextsInStoreFunc)CertEnumCertificatesInStore,
(GetContextPropertyFunc)CertGetCertificateContextProperty,
(SetContextPropertyFunc)CertSetCertificateContextProperty,
(SerializeElementFunc)CertSerializeCertificateStoreElement,
(FreeContextFunc)CertFreeCertificateContext,
(DeleteContextFunc)CertDeleteCertificateFromStore,
};
static const WINE_CONTEXT_INTERFACE gCRLInterface = {
(CreateContextFunc)CertCreateCRLContext,
(AddContextToStoreFunc)CertAddCRLContextToStore,
(AddEncodedContextToStoreFunc)CertAddEncodedCRLToStore,
(EnumContextsInStoreFunc)CertEnumCRLsInStore,
(GetContextPropertyFunc)CertGetCRLContextProperty,
(SetContextPropertyFunc)CertSetCRLContextProperty,
(SerializeElementFunc)CertSerializeCRLStoreElement,
(FreeContextFunc)CertFreeCRLContext,
(DeleteContextFunc)CertDeleteCRLFromStore,
};
static const WINE_CONTEXT_INTERFACE gCTLInterface = {
(CreateContextFunc)CertCreateCTLContext,
(AddContextToStoreFunc)CertAddCTLContextToStore,
(AddEncodedContextToStoreFunc)CertAddEncodedCTLToStore,
(EnumContextsInStoreFunc)CertEnumCTLsInStore,
(GetContextPropertyFunc)CertGetCTLContextProperty,
(SetContextPropertyFunc)CertSetCTLContextProperty,
(SerializeElementFunc)CertSerializeCTLStoreElement,
(FreeContextFunc)CertFreeCTLContext,
(DeleteContextFunc)CertDeleteCTLFromStore,
};
/* An extended certificate property in serialized form is prefixed by this
* header.
*/
typedef struct _WINE_CERT_PROP_HEADER
{
DWORD propID;
DWORD unknown; /* always 1 */
DWORD cb;
} WINE_CERT_PROP_HEADER, *PWINE_CERT_PROP_HEADER;
BOOL WINAPI CertSerializeCRLStoreElement(PCCRL_CONTEXT pCrlContext,
DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement)
{
FIXME("(%p, %08lx, %p, %p): stub\n", pCrlContext, dwFlags, pbElement,
pcbElement);
return FALSE;
}
BOOL WINAPI CertSerializeCTLStoreElement(PCCTL_CONTEXT pCtlContext,
DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement)
{
FIXME("(%p, %08lx, %p, %p): stub\n", pCtlContext, dwFlags, pbElement,
pcbElement);
return FALSE;
}
BOOL WINAPI CertSerializeCertificateStoreElement(PCCERT_CONTEXT pCertContext,
DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement)
{
BOOL ret;
TRACE("(%p, %08lx, %p, %p)\n", pCertContext, dwFlags, pbElement,
pcbElement);
if (pCertContext)
{
DWORD bytesNeeded = sizeof(WINE_CERT_PROP_HEADER) +
pCertContext->cbCertEncoded;
DWORD prop = 0;
ret = TRUE;
do {
prop = CertEnumCertificateContextProperties(pCertContext, prop);
if (prop)
{
DWORD propSize = 0;
ret = CertGetCertificateContextProperty(pCertContext,
prop, NULL, &propSize);
if (ret)
bytesNeeded += sizeof(WINE_CERT_PROP_HEADER) + propSize;
}
} while (ret && prop != 0);
if (!pbElement)
{
*pcbElement = bytesNeeded;
ret = TRUE;
}
else if (*pcbElement < bytesNeeded)
{
*pcbElement = bytesNeeded;
SetLastError(ERROR_MORE_DATA);
ret = FALSE;
}
else
{
PWINE_CERT_PROP_HEADER hdr;
DWORD bufSize = 0;
LPBYTE buf = NULL;
prop = 0;
do {
prop = CertEnumCertificateContextProperties(pCertContext, prop);
if (prop)
{
DWORD propSize = 0;
ret = CertGetCertificateContextProperty(pCertContext,
prop, NULL, &propSize);
if (ret)
{
if (bufSize < propSize)
{
if (buf)
buf = CryptMemRealloc(buf, propSize);
else
buf = CryptMemAlloc(propSize);
bufSize = propSize;
}
if (buf)
{
ret = CertGetCertificateContextProperty(
pCertContext, prop, buf, &propSize);
if (ret)
{
hdr = (PWINE_CERT_PROP_HEADER)pbElement;
hdr->propID = prop;
hdr->unknown = 1;
hdr->cb = propSize;
pbElement += sizeof(WINE_CERT_PROP_HEADER);
if (propSize)
{
memcpy(pbElement, buf, propSize);
pbElement += propSize;
}
}
}
else
ret = FALSE;
}
}
} while (ret && prop != 0);
CryptMemFree(buf);
hdr = (PWINE_CERT_PROP_HEADER)pbElement;
hdr->propID = CERT_CERT_PROP_ID;
hdr->unknown = 1;
hdr->cb = pCertContext->cbCertEncoded;
memcpy(pbElement + sizeof(WINE_CERT_PROP_HEADER),
pCertContext->pbCertEncoded, pCertContext->cbCertEncoded);
}
}
else
ret = FALSE;
return ret;
}
/* Looks for the property with ID propID in the buffer buf. Returns a pointer
* to its header if a valid header is found, NULL if not. Valid means the
* length of thte property won't overrun buf, and the unknown field is 1.
*/
static const WINE_CERT_PROP_HEADER *CRYPT_findPropID(const BYTE *buf,
DWORD size, DWORD propID)
{
const WINE_CERT_PROP_HEADER *ret = NULL;
BOOL done = FALSE;
while (size && !ret && !done)
{
if (size < sizeof(WINE_CERT_PROP_HEADER))
{
SetLastError(CRYPT_E_FILE_ERROR);
done = TRUE;
}
else
{
const WINE_CERT_PROP_HEADER *hdr =
(const WINE_CERT_PROP_HEADER *)buf;
size -= sizeof(WINE_CERT_PROP_HEADER);
buf += sizeof(WINE_CERT_PROP_HEADER);
if (size < hdr->cb)
{
SetLastError(HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER));
done = TRUE;
}
else if (!hdr->propID)
{
/* assume a zero prop ID means the data are uninitialized, so
* stop looking.
*/
done = TRUE;
}
else if (hdr->unknown != 1)
{
SetLastError(ERROR_FILE_NOT_FOUND);
done = TRUE;
}
else if (hdr->propID == propID)
ret = hdr;
else
{
buf += hdr->cb;
size -= hdr->cb;
}
}
}
return ret;
}
const void *CRYPT_ReadSerializedElement(const BYTE *pbElement, DWORD cbElement,
DWORD dwContextTypeFlags, DWORD *pdwContentType)
{
const void *context;
TRACE("(%p, %ld, %08lx, %p)\n", pbElement, cbElement, dwContextTypeFlags,
pdwContentType);
if (!cbElement)
{
SetLastError(ERROR_END_OF_MEDIA);
return NULL;
}
__TRY
{
const WINE_CONTEXT_INTERFACE *contextInterface = NULL;
const WINE_CERT_PROP_HEADER *hdr = NULL;
DWORD type = 0;
BOOL ret;
ret = TRUE;
context = NULL;
if (dwContextTypeFlags == CERT_STORE_ALL_CONTEXT_FLAG)
{
hdr = CRYPT_findPropID(pbElement, cbElement, CERT_CERT_PROP_ID);
if (hdr)
type = CERT_STORE_CERTIFICATE_CONTEXT;
else
{
hdr = CRYPT_findPropID(pbElement, cbElement, CERT_CRL_PROP_ID);
if (hdr)
type = CERT_STORE_CRL_CONTEXT;
else
{
hdr = CRYPT_findPropID(pbElement, cbElement,
CERT_CTL_PROP_ID);
if (hdr)
type = CERT_STORE_CTL_CONTEXT;
}
}
}
else if (dwContextTypeFlags & CERT_STORE_CERTIFICATE_CONTEXT_FLAG)
{
hdr = CRYPT_findPropID(pbElement, cbElement, CERT_CERT_PROP_ID);
type = CERT_STORE_CERTIFICATE_CONTEXT;
}
else if (dwContextTypeFlags & CERT_STORE_CRL_CONTEXT_FLAG)
{
hdr = CRYPT_findPropID(pbElement, cbElement, CERT_CRL_PROP_ID);
type = CERT_STORE_CRL_CONTEXT;
}
else if (dwContextTypeFlags & CERT_STORE_CTL_CONTEXT_FLAG)
{
hdr = CRYPT_findPropID(pbElement, cbElement, CERT_CTL_PROP_ID);
type = CERT_STORE_CTL_CONTEXT;
}
switch (type)
{
case CERT_STORE_CERTIFICATE_CONTEXT:
contextInterface = &gCertInterface;
break;
case CERT_STORE_CRL_CONTEXT:
contextInterface = &gCRLInterface;
break;
case CERT_STORE_CTL_CONTEXT:
contextInterface = &gCTLInterface;
break;
default:
SetLastError(HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER));
ret = FALSE;
}
if (!hdr)
ret = FALSE;
if (ret)
context = contextInterface->create(X509_ASN_ENCODING,
(BYTE *)hdr + sizeof(WINE_CERT_PROP_HEADER), hdr->cb);
if (ret && context)
{
BOOL noMoreProps = FALSE;
while (!noMoreProps && ret)
{
if (cbElement < sizeof(WINE_CERT_PROP_HEADER))
ret = FALSE;
else
{
const WINE_CERT_PROP_HEADER *hdr =
(const WINE_CERT_PROP_HEADER *)pbElement;
TRACE("prop is %ld\n", hdr->propID);
cbElement -= sizeof(WINE_CERT_PROP_HEADER);
pbElement += sizeof(WINE_CERT_PROP_HEADER);
if (cbElement < hdr->cb)
{
SetLastError(HRESULT_FROM_WIN32(
ERROR_INVALID_PARAMETER));
ret = FALSE;
}
else if (!hdr->propID)
{
/* Like in CRYPT_findPropID, stop if the propID is zero
*/
noMoreProps = TRUE;
}
else if (hdr->unknown != 1)
{
SetLastError(ERROR_FILE_NOT_FOUND);
ret = FALSE;
}
else if (hdr->propID != CERT_CERT_PROP_ID &&
hdr->propID != CERT_CRL_PROP_ID && hdr->propID !=
CERT_CTL_PROP_ID)
{
/* Have to create a blob for most types, but not
* for all.. arghh.
*/
switch (hdr->propID)
{
case CERT_AUTO_ENROLL_PROP_ID:
case CERT_CTL_USAGE_PROP_ID:
case CERT_DESCRIPTION_PROP_ID:
case CERT_FRIENDLY_NAME_PROP_ID:
case CERT_HASH_PROP_ID:
case CERT_KEY_IDENTIFIER_PROP_ID:
case CERT_MD5_HASH_PROP_ID:
case CERT_NEXT_UPDATE_LOCATION_PROP_ID:
case CERT_PUBKEY_ALG_PARA_PROP_ID:
case CERT_PVK_FILE_PROP_ID:
case CERT_SIGNATURE_HASH_PROP_ID:
case CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID:
case CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID:
case CERT_ENROLLMENT_PROP_ID:
case CERT_CROSS_CERT_DIST_POINTS_PROP_ID:
case CERT_RENEWAL_PROP_ID:
{
CRYPT_DATA_BLOB blob = { hdr->cb,
(LPBYTE)pbElement };
ret = contextInterface->setProp(context,
hdr->propID, 0, &blob);
break;
}
case CERT_DATE_STAMP_PROP_ID:
ret = contextInterface->setProp(context,
hdr->propID, 0, pbElement);
break;
default:
FIXME("prop ID %ld: stub\n", hdr->propID);
}
}
pbElement += hdr->cb;
cbElement -= hdr->cb;
if (!cbElement)
noMoreProps = TRUE;
}
}
if (ret)
{
if (pdwContentType)
*pdwContentType = type;
}
else
{
contextInterface->free(context);
context = NULL;
}
}
}
__EXCEPT_PAGE_FAULT
{
SetLastError(STATUS_ACCESS_VIOLATION);
context = NULL;
}
__ENDTRY
return context;
}
BOOL WINAPI CertAddSerializedElementToStore(HCERTSTORE hCertStore,
const BYTE *pbElement, DWORD cbElement, DWORD dwAddDisposition, DWORD dwFlags,
DWORD dwContextTypeFlags, DWORD *pdwContentType, const void **ppvContext)
{
const void *context;
DWORD type;
BOOL ret;
TRACE("(%p, %p, %ld, %08lx, %08lx, %08lx, %p, %p)\n", hCertStore,
pbElement, cbElement, dwAddDisposition, dwFlags, dwContextTypeFlags,
pdwContentType, ppvContext);
/* Call the internal function, then delete the hashes. Tests show this
* function uses real hash values, not whatever's stored in the hash
* property.
*/
context = CRYPT_ReadSerializedElement(pbElement, cbElement,
dwContextTypeFlags, &type);
if (context)
{
const WINE_CONTEXT_INTERFACE *contextInterface = NULL;
switch (type)
{
case CERT_STORE_CERTIFICATE_CONTEXT:
contextInterface = &gCertInterface;
break;
case CERT_STORE_CRL_CONTEXT:
contextInterface = &gCRLInterface;
break;
case CERT_STORE_CTL_CONTEXT:
contextInterface = &gCTLInterface;
break;
default:
SetLastError(HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER));
}
if (contextInterface)
{
contextInterface->setProp(context, CERT_HASH_PROP_ID, 0, NULL);
contextInterface->setProp(context, CERT_MD5_HASH_PROP_ID, 0, NULL);
contextInterface->setProp(context, CERT_SIGNATURE_HASH_PROP_ID, 0,
NULL);
if (pdwContentType)
*pdwContentType = type;
ret = contextInterface->addContextToStore(hCertStore, context,
dwAddDisposition, ppvContext);
contextInterface->free(context);
}
else
ret = FALSE;
}
else
ret = FALSE;
return ret;
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,441 @@
/*
* Copyright 2006 Juan Lang for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winnls.h"
#include "wincrypt.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(crypt);
DWORD WINAPI CertRDNValueToStrA(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
LPSTR psz, DWORD csz)
{
DWORD ret = 0;
TRACE("(%ld, %p, %p, %ld)\n", dwValueType, pValue, psz, csz);
switch (dwValueType)
{
case CERT_RDN_ANY_TYPE:
break;
case CERT_RDN_PRINTABLE_STRING:
case CERT_RDN_IA5_STRING:
if (!psz || !csz)
ret = pValue->cbData;
else
{
DWORD chars = min(pValue->cbData, csz - 1);
if (chars)
{
memcpy(psz, pValue->pbData, chars);
ret += chars;
csz -= chars;
}
}
break;
default:
FIXME("string type %ld unimplemented\n", dwValueType);
}
if (psz && csz)
{
*(psz + ret) = '\0';
csz--;
ret++;
}
else
ret++;
return ret;
}
DWORD WINAPI CertRDNValueToStrW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue,
LPWSTR psz, DWORD csz)
{
DWORD ret = 0;
TRACE("(%ld, %p, %p, %ld)\n", dwValueType, pValue, psz, csz);
switch (dwValueType)
{
case CERT_RDN_ANY_TYPE:
break;
case CERT_RDN_PRINTABLE_STRING:
case CERT_RDN_IA5_STRING:
if (!psz || !csz)
ret = pValue->cbData;
else
{
DWORD chars = min(pValue->cbData, csz - 1);
if (chars)
{
DWORD i;
for (i = 0; i < chars; i++)
psz[i] = pValue->pbData[i];
ret += chars;
csz -= chars;
}
}
break;
default:
FIXME("string type %ld unimplemented\n", dwValueType);
}
if (psz && csz)
{
*(psz + ret) = '\0';
csz--;
ret++;
}
else
ret++;
return ret;
}
DWORD WINAPI CertNameToStrA(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName,
DWORD dwStrType, LPSTR psz, DWORD csz)
{
static const DWORD unsupportedFlags = CERT_NAME_STR_NO_QUOTING_FLAG |
CERT_NAME_STR_REVERSE_FLAG | CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG;
static const char commaSep[] = ", ";
static const char semiSep[] = "; ";
static const char crlfSep[] = "\r\n";
static const char plusSep[] = " + ";
static const char spaceSep[] = " ";
DWORD ret = 0, bytes = 0;
BOOL bRet;
CERT_NAME_INFO *info;
TRACE("(%ld, %p, %08lx, %p, %ld)\n", dwCertEncodingType, pName, dwStrType,
psz, csz);
if (dwStrType & unsupportedFlags)
FIXME("unsupported flags: %08lx\n", dwStrType & unsupportedFlags);
bRet = CryptDecodeObjectEx(dwCertEncodingType, X509_NAME, pName->pbData,
pName->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &bytes);
if (bRet)
{
DWORD i, j, sepLen, rdnSepLen;
LPCSTR sep, rdnSep;
if (dwStrType & CERT_NAME_STR_SEMICOLON_FLAG)
sep = semiSep;
else if (dwStrType & CERT_NAME_STR_CRLF_FLAG)
sep = crlfSep;
else
sep = commaSep;
sepLen = strlen(sep);
if (dwStrType & CERT_NAME_STR_NO_PLUS_FLAG)
rdnSep = spaceSep;
else
rdnSep = plusSep;
rdnSepLen = strlen(rdnSep);
for (i = 0; ret < csz && i < info->cRDN; i++)
{
for (j = 0; ret < csz && j < info->rgRDN[i].cRDNAttr; j++)
{
DWORD chars;
if ((dwStrType & 0x000000ff) == CERT_OID_NAME_STR)
{
/* - 1 is needed to account for the NULL terminator. */
chars = min(
lstrlenA(info->rgRDN[i].rgRDNAttr[j].pszObjId),
csz - ret - 1);
if (psz && chars)
memcpy(psz + ret, info->rgRDN[i].rgRDNAttr[j].pszObjId,
chars);
ret += chars;
csz -= chars;
if (csz > 1)
{
if (psz)
*(psz + ret) = '=';
ret++;
csz--;
}
}
/* FIXME: handle quoting */
chars = CertRDNValueToStrA(
info->rgRDN[i].rgRDNAttr[j].dwValueType,
&info->rgRDN[i].rgRDNAttr[j].Value, psz ? psz + ret : NULL,
csz - ret - 1);
if (chars)
ret += chars - 1;
if (j < info->rgRDN[i].cRDNAttr - 1)
{
if (psz && ret < csz - rdnSepLen - 1)
memcpy(psz + ret, rdnSep, rdnSepLen);
ret += rdnSepLen;
}
}
if (i < info->cRDN - 1)
{
if (psz && ret < csz - sepLen - 1)
memcpy(psz + ret, sep, sepLen);
ret += sepLen;
}
}
LocalFree(info);
}
if (psz && csz)
{
*(psz + ret) = '\0';
csz--;
ret++;
}
else
ret++;
return ret;
}
DWORD WINAPI CertNameToStrW(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName,
DWORD dwStrType, LPWSTR psz, DWORD csz)
{
static const DWORD unsupportedFlags = CERT_NAME_STR_NO_QUOTING_FLAG |
CERT_NAME_STR_REVERSE_FLAG | CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG;
static const WCHAR commaSep[] = { ',',' ',0 };
static const WCHAR semiSep[] = { ';',' ',0 };
static const WCHAR crlfSep[] = { '\r','\n',0 };
static const WCHAR plusSep[] = { ' ','+',' ',0 };
static const WCHAR spaceSep[] = { ' ',0 };
DWORD ret = 0, bytes = 0;
BOOL bRet;
CERT_NAME_INFO *info;
TRACE("(%ld, %p, %08lx, %p, %ld)\n", dwCertEncodingType, pName, dwStrType,
psz, csz);
if (dwStrType & unsupportedFlags)
FIXME("unsupported flags: %08lx\n", dwStrType & unsupportedFlags);
bRet = CryptDecodeObjectEx(dwCertEncodingType, X509_NAME, pName->pbData,
pName->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &info, &bytes);
if (bRet)
{
DWORD i, j, sepLen, rdnSepLen;
LPCWSTR sep, rdnSep;
if (dwStrType & CERT_NAME_STR_SEMICOLON_FLAG)
sep = semiSep;
else if (dwStrType & CERT_NAME_STR_CRLF_FLAG)
sep = crlfSep;
else
sep = commaSep;
sepLen = lstrlenW(sep);
if (dwStrType & CERT_NAME_STR_NO_PLUS_FLAG)
rdnSep = spaceSep;
else
rdnSep = plusSep;
rdnSepLen = lstrlenW(rdnSep);
for (i = 0; ret < csz && i < info->cRDN; i++)
{
for (j = 0; ret < csz && j < info->rgRDN[i].cRDNAttr; j++)
{
DWORD chars;
if ((dwStrType & 0x000000ff) == CERT_OID_NAME_STR)
{
/* - 1 is needed to account for the NULL terminator. */
chars = min(
lstrlenA(info->rgRDN[i].rgRDNAttr[j].pszObjId),
csz - ret - 1);
if (psz && chars)
{
DWORD k;
for (k = 0; k < chars; k++)
*(psz + ret + k) =
info->rgRDN[i].rgRDNAttr[j].pszObjId[k];
}
ret += chars;
csz -= chars;
if (csz > 1)
{
if (psz)
*(psz + ret) = '=';
ret++;
csz--;
}
}
/* FIXME: handle quoting */
chars = CertRDNValueToStrW(
info->rgRDN[i].rgRDNAttr[j].dwValueType,
&info->rgRDN[i].rgRDNAttr[j].Value, psz ? psz + ret : NULL,
csz - ret - 1);
if (chars)
ret += chars - 1;
if (j < info->rgRDN[i].cRDNAttr - 1)
{
if (psz && ret < csz - rdnSepLen - 1)
memcpy(psz + ret, rdnSep, rdnSepLen * sizeof(WCHAR));
ret += rdnSepLen;
}
}
if (i < info->cRDN - 1)
{
if (psz && ret < csz - sepLen - 1)
memcpy(psz + ret, sep, sepLen * sizeof(WCHAR));
ret += sepLen;
}
}
LocalFree(info);
}
if (psz && csz)
{
*(psz + ret) = '\0';
csz--;
ret++;
}
else
ret++;
return ret;
}
DWORD WINAPI CertGetNameStringA(PCCERT_CONTEXT pCertContext, DWORD dwType,
DWORD dwFlags, void *pvTypePara, LPSTR pszNameString, DWORD cchNameString)
{
DWORD ret;
TRACE("(%p, %ld, %08lx, %p, %p, %ld)\n", pCertContext, dwType, dwFlags,
pvTypePara, pszNameString, cchNameString);
if (pszNameString)
{
LPWSTR wideName;
DWORD nameLen;
nameLen = CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara,
NULL, 0);
wideName = CryptMemAlloc(nameLen * sizeof(WCHAR));
if (wideName)
{
CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara,
wideName, nameLen);
nameLen = WideCharToMultiByte(CP_ACP, 0, wideName, nameLen,
pszNameString, cchNameString, NULL, NULL);
if (nameLen <= cchNameString)
ret = nameLen;
else
{
pszNameString[cchNameString - 1] = '\0';
ret = cchNameString;
}
CryptMemFree(wideName);
}
else
{
*pszNameString = '\0';
ret = 1;
}
}
else
ret = CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara,
NULL, 0);
return ret;
}
DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType,
DWORD dwFlags, void *pvTypePara, LPWSTR pszNameString, DWORD cchNameString)
{
DWORD ret;
PCERT_NAME_BLOB name;
LPCSTR altNameOID;
TRACE("(%p, %ld, %08lx, %p, %p, %ld)\n", pCertContext, dwType,
dwFlags, pvTypePara, pszNameString, cchNameString);
if (dwFlags & CERT_NAME_ISSUER_FLAG)
{
name = &pCertContext->pCertInfo->Issuer;
altNameOID = szOID_ISSUER_ALT_NAME;
}
else
{
name = &pCertContext->pCertInfo->Subject;
altNameOID = szOID_SUBJECT_ALT_NAME;
}
switch (dwType)
{
case CERT_NAME_SIMPLE_DISPLAY_TYPE:
{
static const LPCSTR simpleAttributeOIDs[] = { szOID_COMMON_NAME,
szOID_ORGANIZATIONAL_UNIT_NAME, szOID_ORGANIZATION_NAME,
szOID_RSA_emailAddr };
CERT_NAME_INFO *info = NULL;
PCERT_RDN_ATTR nameAttr = NULL;
DWORD bytes = 0, i;
if (CryptDecodeObjectEx(pCertContext->dwCertEncodingType, X509_NAME,
name->pbData, name->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &info,
&bytes))
{
for (i = 0; !nameAttr && i < sizeof(simpleAttributeOIDs) /
sizeof(simpleAttributeOIDs[0]); i++)
nameAttr = CertFindRDNAttr(simpleAttributeOIDs[i], info);
}
else
ret = 0;
if (!nameAttr)
{
PCERT_EXTENSION ext = CertFindExtension(altNameOID,
pCertContext->pCertInfo->cExtension,
pCertContext->pCertInfo->rgExtension);
if (ext)
{
for (i = 0; !nameAttr && i < sizeof(simpleAttributeOIDs) /
sizeof(simpleAttributeOIDs[0]); i++)
nameAttr = CertFindRDNAttr(simpleAttributeOIDs[i], info);
if (!nameAttr)
{
/* FIXME: gotta then look for a rfc822Name choice in ext.
* Failing that, look for the first attribute.
*/
FIXME("CERT_NAME_SIMPLE_DISPLAY_TYPE: stub\n");
ret = 0;
}
}
}
ret = CertRDNValueToStrW(nameAttr->dwValueType, &nameAttr->Value,
pszNameString, cchNameString);
if (info)
LocalFree(info);
break;
}
case CERT_NAME_FRIENDLY_DISPLAY_TYPE:
{
DWORD cch = cchNameString;
if (CertGetCertificateContextProperty(pCertContext,
CERT_FRIENDLY_NAME_PROP_ID, pszNameString, &cch))
ret = cch;
else
ret = CertGetNameStringW(pCertContext,
CERT_NAME_SIMPLE_DISPLAY_TYPE, dwFlags, pvTypePara, pszNameString,
cchNameString);
break;
}
default:
FIXME("unimplemented for type %ld\n", dwType);
ret = 0;
}
return ret;
}

View file

@ -41,7 +41,7 @@ reactos/dll/win32/avifil32 # Synced to Wine-0_9_5
reactos/dll/win32/cabinet # Synced to Wine-0_9_10
reactos/dll/win32/comctl32 # Synced to Wine-20060328
reactos/dll/win32/comdlg32 # Synced to Wine-0_9_5
reactos/dll/win32/crypt32 # Synced to Wine-0_9_5
reactos/dll/win32/crypt32 # Synced to Wine-0_9_10
reactos/dll/win32/dbghelp #
reactos/dll/win32/icmp # Synced to Wine-0_9_5
reactos/dll/win32/imm32 # Synced to Wine-0_9_10