Mercurial > dropbear
comparison libtomcrypt/src/pk/asn1/der/sequence/der_decode_subject_public_key_info.c @ 1471:6dba84798cd5
Update to libtomcrypt 1.18.1, merged with Dropbear changes
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Fri, 09 Feb 2018 21:44:05 +0800 |
parents | |
children | e9dba7abd939 |
comparison
equal
deleted
inserted
replaced
1470:8bba51a55704 | 1471:6dba84798cd5 |
---|---|
1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis | |
2 * | |
3 * LibTomCrypt is a library that provides various cryptographic | |
4 * algorithms in a highly modular and flexible manner. | |
5 * | |
6 * The library is free for all purposes without any express | |
7 * guarantee it works. | |
8 */ | |
9 #include "tomcrypt.h" | |
10 /** | |
11 @file der_decode_subject_public_key_info.c | |
12 ASN.1 DER, encode a Subject Public Key structure --nmav | |
13 */ | |
14 | |
15 #ifdef LTC_DER | |
16 | |
17 /* AlgorithmIdentifier := SEQUENCE { | |
18 * algorithm OBJECT IDENTIFIER, | |
19 * parameters ANY DEFINED BY algorithm | |
20 * } | |
21 * | |
22 * SubjectPublicKeyInfo := SEQUENCE { | |
23 * algorithm AlgorithmIdentifier, | |
24 * subjectPublicKey BIT STRING | |
25 * } | |
26 */ | |
27 /** | |
28 Decode a subject public key info | |
29 @param in The input buffer | |
30 @param inlen The length of the input buffer | |
31 @param algorithm One out of the enum #public_key_algorithms | |
32 @param public_key The buffer for the public key | |
33 @param public_key_len [in/out] The length of the public key buffer and the written length | |
34 @param parameters_type The parameters' type out of the enum ltc_asn1_type | |
35 @param parameters The parameters to include | |
36 @param parameters_len The number of parameters to include | |
37 @return CRYPT_OK on success | |
38 */ | |
39 int der_decode_subject_public_key_info(const unsigned char *in, unsigned long inlen, | |
40 unsigned int algorithm, void* public_key, unsigned long* public_key_len, | |
41 unsigned long parameters_type, ltc_asn1_list* parameters, unsigned long parameters_len) | |
42 { | |
43 int err; | |
44 unsigned long len; | |
45 oid_st oid; | |
46 unsigned char *tmpbuf; | |
47 unsigned long tmpoid[16]; | |
48 ltc_asn1_list alg_id[2]; | |
49 ltc_asn1_list subject_pubkey[2]; | |
50 | |
51 LTC_ARGCHK(in != NULL); | |
52 LTC_ARGCHK(inlen != 0); | |
53 LTC_ARGCHK(public_key_len != NULL); | |
54 | |
55 err = pk_get_oid(algorithm, &oid); | |
56 if (err != CRYPT_OK) { | |
57 return err; | |
58 } | |
59 | |
60 /* see if the OpenSSL DER format RSA public key will work */ | |
61 tmpbuf = XCALLOC(1, inlen); | |
62 if (tmpbuf == NULL) { | |
63 err = CRYPT_MEM; | |
64 goto LBL_ERR; | |
65 } | |
66 | |
67 /* this includes the internal hash ID and optional params (NULL in this case) */ | |
68 LTC_SET_ASN1(alg_id, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, sizeof(tmpoid)/sizeof(tmpoid[0])); | |
69 LTC_SET_ASN1(alg_id, 1, (ltc_asn1_type)parameters_type, parameters, parameters_len); | |
70 | |
71 /* the actual format of the SSL DER key is odd, it stores a RSAPublicKey | |
72 * in a **BIT** string ... so we have to extract it then proceed to convert bit to octet | |
73 */ | |
74 LTC_SET_ASN1(subject_pubkey, 0, LTC_ASN1_SEQUENCE, alg_id, 2); | |
75 LTC_SET_ASN1(subject_pubkey, 1, LTC_ASN1_RAW_BIT_STRING, tmpbuf, inlen*8U); | |
76 | |
77 err=der_decode_sequence(in, inlen, subject_pubkey, 2UL); | |
78 if (err != CRYPT_OK) { | |
79 goto LBL_ERR; | |
80 } | |
81 | |
82 if ((alg_id[0].size != oid.OIDlen) || | |
83 XMEMCMP(oid.OID, alg_id[0].data, oid.OIDlen * sizeof(oid.OID[0]))) { | |
84 /* OID mismatch */ | |
85 err = CRYPT_PK_INVALID_TYPE; | |
86 goto LBL_ERR; | |
87 } | |
88 | |
89 len = subject_pubkey[1].size/8; | |
90 if (*public_key_len > len) { | |
91 XMEMCPY(public_key, subject_pubkey[1].data, len); | |
92 *public_key_len = len; | |
93 } else { | |
94 *public_key_len = len; | |
95 err = CRYPT_BUFFER_OVERFLOW; | |
96 goto LBL_ERR; | |
97 } | |
98 | |
99 err = CRYPT_OK; | |
100 | |
101 LBL_ERR: | |
102 | |
103 XFREE(tmpbuf); | |
104 | |
105 return err; | |
106 } | |
107 | |
108 #endif | |
109 | |
110 /* ref: $Format:%D$ */ | |
111 /* git commit: $Format:%H$ */ | |
112 /* commit time: $Format:%ai$ */ |