📄 asn1s_rw.c
字号:
/****************************************************************************
* *
* ASN.1 Supplemental Read/Write Routines *
* Copyright Peter Gutmann 1992-2003 *
* *
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined( INC_ALL ) || defined( INC_CHILD )
#include "asn1_rw.h"
#include "asn1s_rw.h"
#else
#include "misc/asn1_rw.h"
#include "misc/asn1s_rw.h"
#endif /* Compiler-specific includes */
/****************************************************************************
* *
* Object Identifier Routines *
* *
****************************************************************************/
/* A table mapping OID's to algorithm types. We take advantage of the fact
that object identifiers were designed to be handled in the encoded form
(without any need for decoding) and compare expected OID's with the raw
encoded form. Some OID's are for pure algorithms, others are for aWithB
type combinations (usually encryption + hash), in this case the algorithm
is the encryption and the subAlgorithm is the hash.
There are multiple OID's for RSA, the main ones being rsa (which doesn't
specify an exact data format and is deprecated), rsaEncryption (as per
PKCS #1, recommended), and rsaSignature (ISO 9796). We use rsaEncryption
and its derived forms (e.g. md5WithRSAEncryption) rather than alternatives
like md5WithRSA. There is also an OID for rsaKeyTransport that uses
PKCS #1 padding but isn't defined by RSADSI.
There are a great many OIDs for DSA and/or SHA. We list the less common
ones after all the other OIDs so that we always encode the more common
form, but can decode many forms (there are even more OIDs for SHA or DSA
with common parameters that we don't bother with).
AES has a whole series of OIDs that vary depending on the key size used,
this isn't of any use since we can tell the keysize from other places so
we just treat them all as a generic single AES OID */
static const FAR_BSS struct {
const CRYPT_ALGO_TYPE algorithm; /* The basic algorithm */
const CRYPT_ALGO_TYPE subAlgorithm; /* The algorithm subtype */
const BYTE *oid; /* The OID for this algorithm */
} algoIDmap[] = {
/* RSA and <hash>WithRSA */
{ CRYPT_ALGO_RSA, CRYPT_ALGO_NONE,
MKOID( "\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01" ) },
/* rsaEncryption (1 2 840 113549 1 1 1) */
{ CRYPT_ALGO_RSA, CRYPT_ALGO_MD2,
MKOID( "\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x02" ) },
/* md2withRSAEncryption (1 2 840 113549 1 1 2) */
{ CRYPT_ALGO_RSA, CRYPT_ALGO_MD4,
MKOID( "\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x03" ) },
/* md4withRSAEncryption (1 2 840 113549 1 1 3) */
{ CRYPT_ALGO_RSA, CRYPT_ALGO_MD5,
MKOID( "\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x04" ) },
/* md5withRSAEncryption (1 2 840 113549 1 1 4) */
{ CRYPT_ALGO_RSA, CRYPT_ALGO_SHA,
MKOID( "\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x05" ) },
/* sha1withRSAEncryption (1 2 840 113549 1 1 5) */
{ CRYPT_ALGO_RSA, CRYPT_ALGO_SHA,
MKOID( "\x06\x06\x2B\x24\x03\x03\x01\x01" ) },
/* Another rsaSignatureWithsha1 (1 3 36 3 3 1 1) */
{ CRYPT_ALGO_RSA, CRYPT_ALGO_RIPEMD160,
MKOID( "\x06\x06\x2B\x24\x03\x03\x01\x02" ) },
/* rsaSignatureWithripemd160 (1 3 36 3 3 1 2) */
/* DSA and dsaWith<hash> */
{ CRYPT_ALGO_DSA, CRYPT_ALGO_NONE,
MKOID( "\x06\x07\x2A\x86\x48\xCE\x38\x04\x01" ) },
/* dsa (1 2 840 10040 4 1) */
{ CRYPT_ALGO_DSA, CRYPT_ALGO_NONE,
MKOID( "\x06\x05\x2B\x0E\x03\x02\x0C" ) },
/* Peculiar deprecated dsa (1 3 14 3 2 12), but used by CDSA and the
German PKI profile */
{ CRYPT_ALGO_DSA, CRYPT_ALGO_SHA,
MKOID( "\x06\x07\x2A\x86\x48\xCE\x38\x04\x03" ) },
/* dsaWithSha1 (1 2 840 10040 4 3) */
{ CRYPT_ALGO_DSA, CRYPT_ALGO_SHA,
MKOID( "\x06\x05\x2B\x0E\x03\x02\x1B" ) },
/* Another dsaWithSHA1 (1 3 14 3 2 27) */
{ CRYPT_ALGO_DSA, CRYPT_ALGO_SHA,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x02\x01\x01\x02" ) },
/* Yet another dsaWithSHA-1 (2 16 840 1 101 2 1 1 2) */
{ CRYPT_ALGO_DSA, CRYPT_ALGO_SHA,
MKOID( "\x06\x05\x2B\x0E\x03\x02\x0D" ) },
/* When they ran out of valid dsaWithSHA's, they started using invalid
ones. This one is from JDK 1.1 and is actually dsaWithSHA, but it's
used as if it were dsaWithSHA-1 (1 3 14 3 2 13) */
/* Elgamal and elgamalWith<hash> */
{ CRYPT_ALGO_ELGAMAL, CRYPT_ALGO_NONE,
MKOID( "\x06\x0A\x2B\x06\x01\x04\x01\x97\x55\x01\x02\x01" ) },
/* elgamal (1 3 6 1 4 1 3029 1 2 1) */
{ CRYPT_ALGO_ELGAMAL, CRYPT_ALGO_SHA,
MKOID( "\x06\x0B\x2B\x06\x01\x04\x01\x97\x55\x01\x02\x01\x01" ) },
/* elgamalWithSHA-1 (1 3 6 1 4 1 3029 1 2 1 1) */
{ CRYPT_ALGO_ELGAMAL, CRYPT_ALGO_RIPEMD160,
MKOID( "\x06\x0B\x2B\x06\x01\x04\x01\x97\x55\x01\x02\x01\x02" ) },
/* elgamalWithRIPEMD-160 (1 3 6 1 4 1 3029 1 2 1 2) */
/* DH */
{ CRYPT_ALGO_DH, CRYPT_ALGO_NONE,
MKOID( "\x06\x07\x2A\x86\x48\xCE\x3E\x02\x01" ) },
/* dhPublicKey (1 2 840 10046 2 1) */
/* KEA */
{ CRYPT_ALGO_KEA, CRYPT_ALGO_NONE,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x02\x01\x01\x16" ) },
/* keyExchangeAlgorithm (2 16 840 1 101 2 1 1 22) */
/* Hash algorithms */
{ CRYPT_ALGO_MD2, CRYPT_ALGO_NONE,
MKOID( "\x06\x08\x2A\x86\x48\x86\xF7\x0D\x02\x02" ) },
/* md2 (1 2 840 113549 2 2) */
{ CRYPT_ALGO_MD2, CRYPT_ALGO_NONE,
MKOID( "\x06\x0B\x60\x86\x48\x01\x86\xF8\x37\x01\x02\x08\x28" ) },
/* Another md2 (2 16 840 1 113719 1 2 8 40) */
{ CRYPT_ALGO_MD4, CRYPT_ALGO_NONE,
MKOID( "\x06\x08\x2A\x86\x48\x86\xF7\x0D\x02\x04" ) },
/* md4 (1 2 840 113549 2 4) */
{ CRYPT_ALGO_MD4, CRYPT_ALGO_NONE,
MKOID( "\x06\x08\x02\x82\x06\x01\x0A\x01\x03\x01" ) },
/* Another md4 (0 2 262 1 10 1 3 1) */
{ CRYPT_ALGO_MD4, CRYPT_ALGO_NONE,
MKOID( "\x06\x0B\x60\x86\x48\x01\x86\xF8\x37\x01\x02\x08\x5F" ) },
/* Yet another md4 (2 16 840 1 113719 1 2 8 95) */
{ CRYPT_ALGO_MD5, CRYPT_ALGO_NONE,
MKOID( "\x06\x08\x2A\x86\x48\x86\xF7\x0D\x02\x05" ) },
/* md5 (1 2 840 113549 2 5) */
{ CRYPT_ALGO_MD5, CRYPT_ALGO_NONE,
MKOID( "\x06\x08\x02\x82\x06\x01\x0A\x01\x03\x02" ) },
/* Another md5 (0 2 262 1 10 1 3 2) */
{ CRYPT_ALGO_MD5, CRYPT_ALGO_NONE,
MKOID( "\x06\x0B\x60\x86\x48\x01\x86\xF8\x37\x01\x02\x08\x32" ) },
/* Yet another md5 (2 16 840 1 113719 1 2 8 50) */
{ CRYPT_ALGO_SHA, CRYPT_ALGO_NONE,
MKOID( "\x06\x05\x2B\x0E\x03\x02\x1A" ) },
/* sha1 (1 3 14 3 2 26) */
{ CRYPT_ALGO_SHA, CRYPT_ALGO_NONE,
MKOID( "\x06\x0B\x60\x86\x48\x01\x86\xF8\x37\x01\x02\x08\x52" ) },
/* Another sha1 (2 16 840 1 113719 1 2 8 82) */
{ CRYPT_ALGO_RIPEMD160, CRYPT_ALGO_NONE,
MKOID( "\x06\x05\x2B\x24\x03\x02\x01" ) },
/* ripemd160 (1 3 36 3 2 1) */
{ CRYPT_ALGO_RIPEMD160, CRYPT_ALGO_NONE,
MKOID( "\x06\x08\x02\x82\x06\x01\x0A\x01\x03\x08" ) },
/* Another ripemd160 (0 2 262 1 10 1 3 8) */
#ifdef USE_SHA2
{ CRYPT_ALGO_SHA2, CRYPT_ALGO_NONE,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01" ) },
/* SHA2-256 (2 16 840 1 101 3 4 2 1) */
{ CRYPT_ALGO_SHA2, CRYPT_ALGO_NONE,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02" ) },
/* SHA2-384 (2 16 840 1 101 3 4 2 2) */
{ CRYPT_ALGO_SHA2, CRYPT_ALGO_NONE,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03" ) },
/* SHA2-512 (2 16 840 1 101 3 4 2 3) */
#endif /* USE_SHA2 */
/* MAC algorithms */
{ CRYPT_ALGO_HMAC_MD5, CRYPT_ALGO_NONE,
MKOID( "\x06\x08\x2B\x06\x01\x05\x05\x08\x01\x01" ) },
/* hmac-MD5 (1 3 6 1 5 5 8 1 1) */
{ CRYPT_ALGO_HMAC_SHA, CRYPT_ALGO_NONE,
MKOID( "\x06\x08\x2B\x06\x01\x05\x05\x08\x01\x02" ) },
/* hmac-SHA (1 3 6 1 5 5 8 1 2) */
{ CRYPT_ALGO_HMAC_SHA, CRYPT_ALGO_NONE,
MKOID( "\x06\x08\x2A\x86\x48\x86\xF7\x0D\x02\x07" ) },
/* Another hmacWithSHA1 (1 2 840 113549 2 7) */
/* Ciphers */
{ CRYPT_ALGO_AES, CRYPT_MODE_ECB,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x01" ) },
/* aes128-ECB (2 16 840 1 101 3 4 1 1) */
{ CRYPT_ALGO_AES, CRYPT_MODE_ECB,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x15" ) },
/* aes192-ECB (2 16 840 1 101 3 4 1 21) */
{ CRYPT_ALGO_AES, CRYPT_MODE_ECB,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x29" ) },
/* aes256-ECB (2 16 840 1 101 3 4 1 41) */
{ CRYPT_ALGO_AES, CRYPT_MODE_CBC,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x02" ) },
/* aes128-CBC (2 16 840 1 101 3 4 1 2) */
{ CRYPT_ALGO_AES, CRYPT_MODE_CBC,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x16" ) },
/* aes192-CBC (2 16 840 1 101 3 4 1 22) */
{ CRYPT_ALGO_AES, CRYPT_MODE_CBC,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x2A" ) },
/* aes256-CBC (2 16 840 1 101 3 4 1 42) */
{ CRYPT_ALGO_AES, CRYPT_MODE_OFB,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x03" ) },
/* aes128-OFB (2 16 840 1 101 3 4 1 3) */
{ CRYPT_ALGO_AES, CRYPT_MODE_OFB,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x17" ) },
/* aes192-OFB (2 16 840 1 101 3 4 1 23) */
{ CRYPT_ALGO_AES, CRYPT_MODE_OFB,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x2B" ) },
/* aes256-OFB (2 16 840 1 101 3 4 1 43) */
{ CRYPT_ALGO_AES, CRYPT_MODE_CFB,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x04" ) },
/* aes128-CFB (2 16 840 1 101 3 4 1 4) */
{ CRYPT_ALGO_AES, CRYPT_MODE_CFB,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x18" ) },
/* aes192-CFB (2 16 840 1 101 3 4 1 24) */
{ CRYPT_ALGO_AES, CRYPT_MODE_CFB,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x03\x04\x01\x2C" ) },
/* aes256-CFB (2 16 840 1 101 3 4 1 44) */
{ CRYPT_ALGO_BLOWFISH, CRYPT_MODE_ECB,
MKOID( "\x06\x0A\x2B\x06\x01\x04\x01\x97\x55\x01\x01\x01" ) },
/* blowfishECB (1 3 6 1 4 1 3029 1 1 1) */
{ CRYPT_ALGO_BLOWFISH, CRYPT_MODE_CBC,
MKOID( "\x06\x0A\x2B\x06\x01\x04\x01\x97\x55\x01\x01\x02" ) },
/* blowfishCBC (1 3 6 1 4 1 3029 1 1 2) */
{ CRYPT_ALGO_BLOWFISH, CRYPT_MODE_CFB,
MKOID( "\x06\x0A\x2B\x06\x01\x04\x01\x97\x55\x01\x01\x03" ) },
/* blowfishCFB (1 3 6 1 4 1 3029 1 1 3) */
{ CRYPT_ALGO_BLOWFISH, CRYPT_MODE_OFB,
MKOID( "\x06\x0A\x2B\x06\x01\x04\x01\x97\x55\x01\x01\x04" ) },
/* blowfishOFB (1 3 6 1 4 1 3029 1 1 4) */
{ CRYPT_ALGO_CAST, CRYPT_MODE_CBC,
MKOID( "\x06\x09\x2A\x86\x48\x86\xF6\x7D\x07\x42\x0A" ) },
/* cast5CBC (1 2 840 113533 7 66 10) */
{ CRYPT_ALGO_DES, CRYPT_MODE_ECB,
MKOID( "\x06\x05\x2B\x0E\x03\x02\x06" ) },
/* desECB (1 3 14 3 2 6) */
{ CRYPT_ALGO_DES, CRYPT_MODE_ECB,
MKOID( "\x06\x09\x02\x82\x06\x01\x0A\x01\x02\x02\x01" ) },
/* Another desECB (0 2 262 1 10 1 2 2 1) */
{ CRYPT_ALGO_DES, CRYPT_MODE_CBC,
MKOID( "\x06\x05\x2B\x0E\x03\x02\x07" ) },
/* desCBC (1 3 14 3 2 7) */
{ CRYPT_ALGO_DES, CRYPT_MODE_CBC,
MKOID( "\x06\x09\x02\x82\x06\x01\x0A\x01\x02\x02\x02" ) },
/* Another desCBC (0 2 262 1 10 1 2 2 2) */
{ CRYPT_ALGO_DES, CRYPT_MODE_OFB,
MKOID( "\x06\x05\x2B\x0E\x03\x02\x08" ) },
/* desOFB (1 3 14 3 2 8) */
{ CRYPT_ALGO_DES, CRYPT_MODE_OFB,
MKOID( "\x06\x09\x02\x82\x06\x01\x0A\x01\x02\x02\x03" ) },
/* Another desOFB (0 2 262 1 10 1 2 2 3) */
{ CRYPT_ALGO_DES, CRYPT_MODE_CFB,
MKOID( "\x06\x05\x2B\x0E\x03\x02\x09" ) },
/* desCFB (1 3 14 3 2 9) */
{ CRYPT_ALGO_DES, CRYPT_MODE_CFB,
MKOID( "\x06\x09\x02\x82\x06\x01\x0A\x01\x02\x02\x05" ) },
/* Another desCFB (0 2 262 1 10 1 2 2 5) */
{ CRYPT_ALGO_3DES, CRYPT_MODE_CBC,
MKOID( "\x06\x08\x2A\x86\x48\x86\xF7\x0D\x03\x07" ) },
/* des-EDE3-CBC (1 2 840 113549 3 7) */
{ CRYPT_ALGO_3DES, CRYPT_MODE_CBC,
MKOID( "\x06\x09\x02\x82\x06\x01\x0A\x01\x02\x03\x02" ) },
/* Another des3CBC (0 2 262 1 10 1 2 3 2) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_ECB,
MKOID( "\x06\x0B\x2B\x06\x01\x04\x01\x81\x3C\x07\x01\x01\x01" ) },
/* ideaECB (1 3 6 1 4 1 188 7 1 1 1) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_ECB,
MKOID( "\x06\x06\x2B\x24\x03\x01\x02\x01" ) },
/* Another ideaECB (1 3 36 3 1 2 1) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_ECB,
MKOID( "\x06\x09\x02\x82\x06\x01\x0A\x01\x02\x05\x01" ) },
/* Yet another ideaECB (0 2 262 1 10 1 2 5 1) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_CBC,
MKOID( "\x06\x0B\x2B\x06\x01\x04\x01\x81\x3C\x07\x01\x01\x02" ) },
/* ideaCBC (1 3 6 1 4 1 188 7 1 1 2) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_CBC,
MKOID( "\x06\x06\x2B\x24\x03\x01\x02\x02" ) },
/* Another ideaCBC (1 3 36 3 1 2 2) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_CBC,
MKOID( "\x06\x09\x02\x82\x06\x01\x0A\x01\x02\x05\x02" ) },
/* Yet another ideaCBC (0 2 262 1 10 1 2 5 2) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_OFB,
MKOID( "\x06\x0B\x2B\x06\x01\x04\x01\x81\x3C\x07\x01\x01\x04" ) },
/* ideaOFB (1 3 6 1 4 1 188 7 1 1 4) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_OFB,
MKOID( "\x06\x06\x2B\x24\x03\x01\x02\x03" ) },
/* Another ideaOFB (1 3 36 3 1 2 3) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_OFB,
MKOID( "\x06\x09\x02\x82\x06\x01\x0A\x01\x02\x05\x03" ) },
/* Yet another ideaOFB (0 2 262 1 10 1 2 5 3) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_CFB,
MKOID( "\x06\x0B\x2B\x06\x01\x04\x01\x81\x3C\x07\x01\x01\x03" ) },
/* ideaCFB (1 3 6 1 4 1 188 7 1 1 3) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_CFB,
MKOID( "\x06\x06\x2B\x24\x03\x01\x02\x04" ) },
/* Another ideaCFB (1 3 36 3 1 2 4) */
{ CRYPT_ALGO_IDEA, CRYPT_MODE_CFB,
MKOID( "\x06\x09\x02\x82\x06\x01\x0A\x01\x02\x05\x05" ) },
/* Yet another ideaCFB (0 2 262 1 10 1 2 5 5) */
{ CRYPT_ALGO_RC2, CRYPT_MODE_CBC,
MKOID( "\x06\x08\x2A\x86\x48\x86\xF7\x0D\x03\x02" ) },
/* rc2CBC (1 2 840 113549 3 2) */
{ CRYPT_ALGO_RC2, CRYPT_MODE_ECB,
MKOID( "\x06\x08\x2A\x86\x48\x86\xF7\x0D\x03\x03" ) },
/* rc2ECB (1 2 840 113549 3 3) */
{ CRYPT_ALGO_RC4, CRYPT_MODE_OFB,
MKOID( "\x06\x08\x2A\x86\x48\x86\xF7\x0D\x03\x04" ) },
/* rc4 (1 2 840 113549 3 4) */
{ CRYPT_ALGO_RC5, CRYPT_MODE_CBC,
MKOID( "\x06\x08\x2A\x86\x48\x86\xF7\x0D\x03\x09" ) },
/* rC5-CBCPad (1 2 840 113549 3 9) */
{ CRYPT_ALGO_RC5, CRYPT_MODE_CBC,
MKOID( "\x06\x08\x2A\x86\x48\x86\xF7\x0D\x03\x08" ) },
/* rc5CBC (sometimes used interchangeably with the above) (1 2 840 113549 3 8) */
{ CRYPT_ALGO_SKIPJACK, CRYPT_MODE_CBC,
MKOID( "\x06\x09\x60\x86\x48\x01\x65\x02\x01\x01\x04" ) },
/* fortezzaConfidentialityAlgorithm (2 16 840 1 101 2 1 1 4) */
{ CRYPT_ALGO_NONE, CRYPT_ALGO_NONE, NULL }
};
/* Map an OID to an algorithm type. The subAlgorithm parameter can be
NULL, in which case we don't return the sub-algorithm, but we return
an error code if the OID has a sub-algorithm type */
static CRYPT_ALGO_TYPE oidToAlgorithm( const BYTE *oid, int *subAlgorithm )
{
const int oidSize = sizeofOID( oid );
int i;
for( i = 0; algoIDmap[ i ].algorithm != CRYPT_ALGO_NONE; i++ )
if( sizeofOID( algoIDmap[ i ].oid ) == oidSize && \
!memcmp( algoIDmap[ i ].oid, oid, oidSize ) )
{
if( subAlgorithm != NULL )
/* Return the sub-algorithm type */
*subAlgorithm = algoIDmap[ i ].subAlgorithm;
else
/* If we're not expecting a sub-algorithm but there's one
present, mark it as an error */
if( algoIDmap[ i ].subAlgorithm != CRYPT_ALGO_NONE )
return( CRYPT_ERROR );
return( algoIDmap[ i ].algorithm );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -