Skip to content

Commit 03881e4

Browse files
authored
Merge pull request #699 from libtom/some-improvements
Some improvements
2 parents eda303d + 369650c commit 03881e4

19 files changed

+406
-241
lines changed

libtomcrypt_VS2008.vcproj

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2281,6 +2281,14 @@
22812281
RelativePath="src\pk\asn1\x509\x509_encode_subject_public_key_info.c"
22822282
>
22832283
</File>
2284+
<File
2285+
RelativePath="src\pk\asn1\x509\x509_get_pka.c"
2286+
>
2287+
</File>
2288+
<File
2289+
RelativePath="src\pk\asn1\x509\x509_import_spki.c"
2290+
>
2291+
</File>
22842292
</Filter>
22852293
</Filter>
22862294
<Filter

makefile.mingw

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,10 @@ src/pk/asn1/oid/pk_get.o src/pk/asn1/oid/pk_oid_cmp.o src/pk/asn1/oid/pk_oid_str
176176
src/pk/asn1/pkcs8/pkcs8_decode_flexi.o src/pk/asn1/pkcs8/pkcs8_get.o \
177177
src/pk/asn1/x509/x509_decode_public_key_from_certificate.o src/pk/asn1/x509/x509_decode_spki.o \
178178
src/pk/asn1/x509/x509_decode_subject_public_key_info.o \
179-
src/pk/asn1/x509/x509_encode_subject_public_key_info.o src/pk/dh/dh.o src/pk/dh/dh_check_pubkey.o \
180-
src/pk/dh/dh_export.o src/pk/dh/dh_export_key.o src/pk/dh/dh_free.o src/pk/dh/dh_generate_key.o \
181-
src/pk/dh/dh_import.o src/pk/dh/dh_import_pkcs8.o src/pk/dh/dh_set.o src/pk/dh/dh_set_pg_dhparam.o \
179+
src/pk/asn1/x509/x509_encode_subject_public_key_info.o src/pk/asn1/x509/x509_get_pka.o \
180+
src/pk/asn1/x509/x509_import_spki.o src/pk/dh/dh.o src/pk/dh/dh_check_pubkey.o src/pk/dh/dh_export.o \
181+
src/pk/dh/dh_export_key.o src/pk/dh/dh_free.o src/pk/dh/dh_generate_key.o src/pk/dh/dh_import.o \
182+
src/pk/dh/dh_import_pkcs8.o src/pk/dh/dh_set.o src/pk/dh/dh_set_pg_dhparam.o \
182183
src/pk/dh/dh_shared_secret.o src/pk/dsa/dsa_decrypt_key.o src/pk/dsa/dsa_encrypt_key.o \
183184
src/pk/dsa/dsa_export.o src/pk/dsa/dsa_free.o src/pk/dsa/dsa_generate_key.o \
184185
src/pk/dsa/dsa_generate_pqg.o src/pk/dsa/dsa_import.o src/pk/dsa/dsa_import_pkcs8.o \

makefile.msvc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,9 +169,10 @@ src/pk/asn1/oid/pk_get.obj src/pk/asn1/oid/pk_oid_cmp.obj src/pk/asn1/oid/pk_oid
169169
src/pk/asn1/pkcs8/pkcs8_decode_flexi.obj src/pk/asn1/pkcs8/pkcs8_get.obj \
170170
src/pk/asn1/x509/x509_decode_public_key_from_certificate.obj src/pk/asn1/x509/x509_decode_spki.obj \
171171
src/pk/asn1/x509/x509_decode_subject_public_key_info.obj \
172-
src/pk/asn1/x509/x509_encode_subject_public_key_info.obj src/pk/dh/dh.obj src/pk/dh/dh_check_pubkey.obj \
173-
src/pk/dh/dh_export.obj src/pk/dh/dh_export_key.obj src/pk/dh/dh_free.obj src/pk/dh/dh_generate_key.obj \
174-
src/pk/dh/dh_import.obj src/pk/dh/dh_import_pkcs8.obj src/pk/dh/dh_set.obj src/pk/dh/dh_set_pg_dhparam.obj \
172+
src/pk/asn1/x509/x509_encode_subject_public_key_info.obj src/pk/asn1/x509/x509_get_pka.obj \
173+
src/pk/asn1/x509/x509_import_spki.obj src/pk/dh/dh.obj src/pk/dh/dh_check_pubkey.obj src/pk/dh/dh_export.obj \
174+
src/pk/dh/dh_export_key.obj src/pk/dh/dh_free.obj src/pk/dh/dh_generate_key.obj src/pk/dh/dh_import.obj \
175+
src/pk/dh/dh_import_pkcs8.obj src/pk/dh/dh_set.obj src/pk/dh/dh_set_pg_dhparam.obj \
175176
src/pk/dh/dh_shared_secret.obj src/pk/dsa/dsa_decrypt_key.obj src/pk/dsa/dsa_encrypt_key.obj \
176177
src/pk/dsa/dsa_export.obj src/pk/dsa/dsa_free.obj src/pk/dsa/dsa_generate_key.obj \
177178
src/pk/dsa/dsa_generate_pqg.obj src/pk/dsa/dsa_import.obj src/pk/dsa/dsa_import_pkcs8.obj \

makefile.unix

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,10 @@ src/pk/asn1/oid/pk_get.o src/pk/asn1/oid/pk_oid_cmp.o src/pk/asn1/oid/pk_oid_str
190190
src/pk/asn1/pkcs8/pkcs8_decode_flexi.o src/pk/asn1/pkcs8/pkcs8_get.o \
191191
src/pk/asn1/x509/x509_decode_public_key_from_certificate.o src/pk/asn1/x509/x509_decode_spki.o \
192192
src/pk/asn1/x509/x509_decode_subject_public_key_info.o \
193-
src/pk/asn1/x509/x509_encode_subject_public_key_info.o src/pk/dh/dh.o src/pk/dh/dh_check_pubkey.o \
194-
src/pk/dh/dh_export.o src/pk/dh/dh_export_key.o src/pk/dh/dh_free.o src/pk/dh/dh_generate_key.o \
195-
src/pk/dh/dh_import.o src/pk/dh/dh_import_pkcs8.o src/pk/dh/dh_set.o src/pk/dh/dh_set_pg_dhparam.o \
193+
src/pk/asn1/x509/x509_encode_subject_public_key_info.o src/pk/asn1/x509/x509_get_pka.o \
194+
src/pk/asn1/x509/x509_import_spki.o src/pk/dh/dh.o src/pk/dh/dh_check_pubkey.o src/pk/dh/dh_export.o \
195+
src/pk/dh/dh_export_key.o src/pk/dh/dh_free.o src/pk/dh/dh_generate_key.o src/pk/dh/dh_import.o \
196+
src/pk/dh/dh_import_pkcs8.o src/pk/dh/dh_set.o src/pk/dh/dh_set_pg_dhparam.o \
196197
src/pk/dh/dh_shared_secret.o src/pk/dsa/dsa_decrypt_key.o src/pk/dsa/dsa_encrypt_key.o \
197198
src/pk/dsa/dsa_export.o src/pk/dsa/dsa_free.o src/pk/dsa/dsa_generate_key.o \
198199
src/pk/dsa/dsa_generate_pqg.o src/pk/dsa/dsa_import.o src/pk/dsa/dsa_import_pkcs8.o \

makefile_include.mk

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -361,9 +361,10 @@ src/pk/asn1/oid/pk_get.o src/pk/asn1/oid/pk_oid_cmp.o src/pk/asn1/oid/pk_oid_str
361361
src/pk/asn1/pkcs8/pkcs8_decode_flexi.o src/pk/asn1/pkcs8/pkcs8_get.o \
362362
src/pk/asn1/x509/x509_decode_public_key_from_certificate.o src/pk/asn1/x509/x509_decode_spki.o \
363363
src/pk/asn1/x509/x509_decode_subject_public_key_info.o \
364-
src/pk/asn1/x509/x509_encode_subject_public_key_info.o src/pk/dh/dh.o src/pk/dh/dh_check_pubkey.o \
365-
src/pk/dh/dh_export.o src/pk/dh/dh_export_key.o src/pk/dh/dh_free.o src/pk/dh/dh_generate_key.o \
366-
src/pk/dh/dh_import.o src/pk/dh/dh_import_pkcs8.o src/pk/dh/dh_set.o src/pk/dh/dh_set_pg_dhparam.o \
364+
src/pk/asn1/x509/x509_encode_subject_public_key_info.o src/pk/asn1/x509/x509_get_pka.o \
365+
src/pk/asn1/x509/x509_import_spki.o src/pk/dh/dh.o src/pk/dh/dh_check_pubkey.o src/pk/dh/dh_export.o \
366+
src/pk/dh/dh_export_key.o src/pk/dh/dh_free.o src/pk/dh/dh_generate_key.o src/pk/dh/dh_import.o \
367+
src/pk/dh/dh_import_pkcs8.o src/pk/dh/dh_set.o src/pk/dh/dh_set_pg_dhparam.o \
367368
src/pk/dh/dh_shared_secret.o src/pk/dsa/dsa_decrypt_key.o src/pk/dsa/dsa_encrypt_key.o \
368369
src/pk/dsa/dsa_export.o src/pk/dsa/dsa_free.o src/pk/dsa/dsa_generate_key.o \
369370
src/pk/dsa/dsa_generate_pqg.o src/pk/dsa/dsa_import.o src/pk/dsa/dsa_import_pkcs8.o \

sources.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,8 @@ src/pk/asn1/x509/x509_decode_public_key_from_certificate.c
373373
src/pk/asn1/x509/x509_decode_spki.c
374374
src/pk/asn1/x509/x509_decode_subject_public_key_info.c
375375
src/pk/asn1/x509/x509_encode_subject_public_key_info.c
376+
src/pk/asn1/x509/x509_get_pka.c
377+
src/pk/asn1/x509/x509_import_spki.c
376378
src/pk/dh/dh.c
377379
src/pk/dh/dh_check_pubkey.c
378380
src/pk/dh/dh_export.c

src/headers/tomcrypt_private.h

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -352,19 +352,40 @@ struct bufp {
352352
};
353353

354354
#define SET_BUFP(n, d, l) n.start = (char*)d, n.work = (char*)d, n.end = (char*)d + l + 1
355+
#define UPDATE_BUFP(n, d, w, l) n.start = (char*)d, n.work = (char*)d + w, n.end = (char*)d + l + 1
355356

356-
struct get_char {
357+
struct get_char;
358+
struct get_char_api {
357359
int (*get)(struct get_char*);
360+
};
361+
362+
struct get_char {
363+
struct get_char_api api;
358364
union {
359365
#ifndef LTC_NO_FILE
360-
FILE *f;
366+
struct {
367+
FILE *f;
368+
} f;
361369
#endif /* LTC_NO_FILE */
362370
struct bufp buf;
363371
} data;
364372
struct str unget_buf;
365373
char unget_buf_[LTC_PEM_DECODE_BUFSZ];
366374
int prev_get;
375+
unsigned long total_read;
367376
};
377+
378+
#define pem_get_char_init(b, l) { \
379+
.api = get_char_buffer_api, \
380+
SET_BUFP(.data.buf, (b), (l)), \
381+
.total_read = 0, \
382+
}
383+
384+
#define pem_get_char_init_filehandle(fi) { \
385+
.api = get_char_filehandle_api, \
386+
.data.f.f = (fi), \
387+
.total_read = 0, \
388+
}
368389
#endif
369390

370391
/* others */
@@ -387,10 +408,10 @@ int pem_decrypt(unsigned char *data, unsigned long *datalen,
387408
const struct blockcipher_info *info,
388409
enum padding_type padding);
389410
#ifndef LTC_NO_FILE
390-
int pem_get_char_from_file(struct get_char *g);
411+
extern const struct get_char_api get_char_filehandle_api;
391412
#endif /* LTC_NO_FILE */
392-
int pem_get_char_from_buf(struct get_char *g);
393-
int pem_read(void *asn1_cert, unsigned long *asn1_len, struct pem_headers *hdr, struct get_char *g);
413+
extern const struct get_char_api get_char_buffer_api;
414+
int pem_read(void **dest, unsigned long *len, struct pem_headers *hdr, struct get_char *g);
394415
#endif
395416

396417
/* tomcrypt_pk.h */
@@ -651,17 +672,29 @@ int der_printable_value_decode(int v);
651672

652673
unsigned long der_utf8_charsize(const wchar_t c);
653674

654-
typedef struct {
675+
typedef int (*der_flexi_handler)(const ltc_asn1_list*, void*);
676+
677+
typedef struct der_flexi_check {
655678
ltc_asn1_type t;
679+
int optional;
656680
ltc_asn1_list **pp;
681+
der_flexi_handler handler;
682+
void *userdata;
657683
} der_flexi_check;
658684

659-
#define LTC_SET_DER_FLEXI_CHECK(list, index, Type, P) \
660-
do { \
661-
int LTC_SDFC_temp##__LINE__ = (index); \
662-
list[LTC_SDFC_temp##__LINE__].t = Type; \
663-
list[LTC_SDFC_temp##__LINE__].pp = P; \
685+
#define LTC_PRIV_SET_DER_FLEXI_CHECK(list, index, Type, P, Opt, Hndl, Udata) \
686+
do { \
687+
int LTC_SDFC_temp##__LINE__ = (index); \
688+
list[LTC_SDFC_temp##__LINE__].t = Type; \
689+
list[LTC_SDFC_temp##__LINE__].pp = P; \
690+
list[LTC_SDFC_temp##__LINE__].optional = Opt; \
691+
list[LTC_SDFC_temp##__LINE__].handler = (der_flexi_handler)Hndl; \
692+
list[LTC_SDFC_temp##__LINE__].userdata = Udata; \
664693
} while (0)
694+
#define LTC_SET_DER_FLEXI_CHECK(list, index, Type, P) LTC_PRIV_SET_DER_FLEXI_CHECK(list, index, Type, P, 0, NULL, NULL)
695+
#define LTC_SET_DER_FLEXI_CHECK_OPT(list, index, Type, P) LTC_PRIV_SET_DER_FLEXI_CHECK(list, index, Type, P, 1, NULL, NULL)
696+
#define LTC_SET_DER_FLEXI_HANDLER(list, index, Type, Hndl, Udata) LTC_PRIV_SET_DER_FLEXI_CHECK(list, index, Type, NULL, 0, Hndl, Udata)
697+
#define LTC_SET_DER_FLEXI_HANDLER_OPT(list, index, Type, Hndl, Udata) LTC_PRIV_SET_DER_FLEXI_CHECK(list, index, Type, NULL, 1, Hndl, Udata)
665698

666699

667700
extern const ltc_asn1_type der_asn1_tag_to_type_map[];
@@ -697,6 +730,9 @@ int x509_decode_subject_public_key_info(const unsigned char *in, unsigned long i
697730
enum ltc_oid_id algorithm, void *public_key, unsigned long *public_key_len,
698731
ltc_asn1_type parameters_type, ltc_asn1_list* parameters, unsigned long *parameters_len);
699732

733+
int x509_get_pka(ltc_asn1_list *pub, enum ltc_pka_id *pka);
734+
int x509_import_spki(const unsigned char *asn1_cert, unsigned long asn1_len, ltc_pka_key *k, ltc_asn1_list **root);
735+
700736
int pk_oid_cmp_with_asn1(const char *o1, const ltc_asn1_list *o2);
701737

702738
#endif /* LTC_DER */

src/misc/pem/pem.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
#ifdef LTC_PEM
1111

1212
const struct pem_header_id pem_std_headers[] = {
13+
{
14+
/* X.509 Certificates */
15+
SET_CSTR(.start, "-----BEGIN CERTIFICATE-----"),
16+
SET_CSTR(.end, "-----END CERTIFICATE-----"),
17+
.has_more_headers = no,
18+
.flags = pf_x509,
19+
},
1320
{
1421
/* PKCS#8 encrypted */
1522
SET_CSTR(.start, "-----BEGIN ENCRYPTED PRIVATE KEY-----"),
@@ -24,13 +31,6 @@ const struct pem_header_id pem_std_headers[] = {
2431
.has_more_headers = no,
2532
.flags = pf_pkcs8,
2633
},
27-
{
28-
/* X.509 Certificates */
29-
SET_CSTR(.start, "-----BEGIN CERTIFICATE-----"),
30-
SET_CSTR(.end, "-----END CERTIFICATE-----"),
31-
.has_more_headers = no,
32-
.flags = pf_x509,
33-
},
3434
{
3535
/* Regular (plain) public keys */
3636
SET_CSTR(.start, "-----BEGIN PUBLIC KEY-----"),

0 commit comments

Comments
 (0)