⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oid.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 4 页
字号:
    BOOL ret;

    if (spotToRemove)
    {
        DWORD len = CRYPT_GetMultiStringCharacterLen(multi);

        /* Copy remainder of string "left" */
        memmove(spotToRemove, spotToRemove + lstrlenW(toRemove) + 1,
         (len - (spotToRemove - multi)) * sizeof(WCHAR));
        ret = TRUE;
    }
    else
    {
        SetLastError(ERROR_FILE_NOT_FOUND);
        ret = FALSE;
    }
    return ret;
}

static BOOL CRYPT_GetDefaultOIDKey(DWORD dwEncodingType, LPCSTR pszFuncName,
 PHKEY key)
{
    LPSTR keyName;
    LONG r;

    keyName = CRYPT_GetKeyName(dwEncodingType, pszFuncName, "DEFAULT");
    TRACE("Key name is %s\n", debugstr_a(keyName));

    if (!keyName)
        return FALSE;

    r = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keyName, 0, NULL, 0, KEY_ALL_ACCESS,
     NULL, key, NULL);
    CryptMemFree(keyName);
    if (r != ERROR_SUCCESS)
    {
        SetLastError(r);
        return FALSE;
    }
    return TRUE;
}

static LPWSTR CRYPT_GetDefaultOIDDlls(HKEY key)
{
    LONG r;
    DWORD type, size;
    LPWSTR dlls;

    r = RegQueryValueExW(key, DllW, NULL, &type, NULL, &size);
    if (r == ERROR_SUCCESS && type == REG_MULTI_SZ)
    {
        dlls = CryptMemAlloc(size);
        r = RegQueryValueExW(key, DllW, NULL, &type, (LPBYTE)dlls, &size);
        if (r != ERROR_SUCCESS)
        {
            CryptMemFree(dlls);
            dlls = NULL;
        }
    }
    else
        dlls = NULL;
    return dlls;
}

static inline BOOL CRYPT_SetDefaultOIDDlls(HKEY key, LPCWSTR dlls)
{
    DWORD len = CRYPT_GetMultiStringCharacterLen(dlls);
    LONG r;

    if ((r = RegSetValueExW(key, DllW, 0, REG_MULTI_SZ, (const BYTE *)dlls,
     len * sizeof (WCHAR))))
        SetLastError(r);
    return r == ERROR_SUCCESS;
}

/***********************************************************************
 *             CryptRegisterDefaultOIDFunction (CRYPT32.@)
 */
BOOL WINAPI CryptRegisterDefaultOIDFunction(DWORD dwEncodingType,
 LPCSTR pszFuncName, DWORD dwIndex, LPCWSTR pwszDll)
{
    HKEY key;
    LPWSTR dlls;
    LPCWSTR existing;
    BOOL ret = FALSE;

    TRACE("(%x, %s, %x, %s)\n", dwEncodingType, pszFuncName, dwIndex,
     debugstr_w(pwszDll));

    if (!pwszDll)
    {
        SetLastError(E_INVALIDARG);
        return FALSE;
    }

    if (!CRYPT_GetDefaultOIDKey(dwEncodingType, pszFuncName, &key))
        return FALSE;

    dlls = CRYPT_GetDefaultOIDDlls(key);
    if ((existing = CRYPT_FindStringInMultiString(dlls, pwszDll)))
        SetLastError(ERROR_FILE_EXISTS);
    else
    {
        dlls = CRYPT_AddStringToMultiString(dlls, pwszDll, dwIndex);
        if (dlls)
            ret = CRYPT_SetDefaultOIDDlls(key, dlls);
    }
    CryptMemFree(dlls);
    RegCloseKey(key);
    return ret;
}

BOOL WINAPI CryptUnregisterDefaultOIDFunction(DWORD dwEncodingType,
 LPCSTR pszFuncName, LPCWSTR pwszDll)
{
    HKEY key;
    LPWSTR dlls;
    BOOL ret;

    TRACE("(%x, %s, %s)\n", dwEncodingType, debugstr_a(pszFuncName),
     debugstr_w(pwszDll));

    if (!pwszDll)
    {
        SetLastError(E_INVALIDARG);
        return FALSE;
    }

    if (!CRYPT_GetDefaultOIDKey(dwEncodingType, pszFuncName, &key))
        return FALSE;

    dlls = CRYPT_GetDefaultOIDDlls(key);
    if ((ret = CRYPT_RemoveStringFromMultiString(dlls, pwszDll)))
        ret = CRYPT_SetDefaultOIDDlls(key, dlls);
    CryptMemFree(dlls);
    RegCloseKey(key);
    return ret;
}

static CRITICAL_SECTION oidInfoCS;
static 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 };

static const 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 },

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -