Skip to content

Commit fe3b3e6

Browse files
committed
Add generic PEM decode APIs
Signed-off-by: Steffen Jaeckel <s@jaeckel.eu>
1 parent 8d19047 commit fe3b3e6

File tree

267 files changed

+1990
-15
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

267 files changed

+1990
-15
lines changed

src/headers/tomcrypt.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,12 @@ enum {
6969

7070
CRYPT_PK_INVALID_SIZE, /* Invalid size input for PK parameters */
7171

72-
CRYPT_INVALID_PRIME_SIZE,/* Invalid size of prime requested */
72+
CRYPT_INVALID_PRIME_SIZE, /* Invalid size of prime requested */
7373
CRYPT_PK_INVALID_PADDING, /* Invalid padding on input */
7474

7575
CRYPT_HASH_OVERFLOW, /* Hash applied to too many bits */
7676
CRYPT_PW_CTX_MISSING, /* Password context to decrypt key file is missing */
77+
CRYPT_UNKNOWN_PEM, /* The PEM header was not recognized */
7778
};
7879

7980
#include "tomcrypt_cfg.h"

src/headers/tomcrypt_misc.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ int padding_depad(const unsigned char *data, unsigned long *length, unsigned lon
160160
#endif /* LTC_PADDING */
161161

162162
#ifdef LTC_PEM
163+
int pem_decode_filehandle(FILE *f, ltc_pka_key *k, const password_ctx *pw_ctx);
164+
int pem_decode(const void *buf, unsigned long len, ltc_pka_key *k, const password_ctx *pw_ctx);
165+
163166
int pem_decode_pkcs_filehandle(FILE *f, ltc_pka_key *k, const password_ctx *pw_ctx);
164167
int pem_decode_pkcs(const void *buf, unsigned long len, ltc_pka_key *k, const password_ctx *pw_ctx);
165168

src/misc/error_to_string.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ static const char * const err_2_str[] =
5353
"Hash applied to too many bits.",
5454

5555
"Password context to decrypt key file is missing.",
56+
57+
"The PEM header was not recognized",
5658
};
5759

5860
/**

src/misc/pem/pem.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,27 @@ int pem_decrypt(unsigned char *data, unsigned long *datalen,
233233
return err;
234234
}
235235

236+
int pem_decode_filehandle(FILE *f, ltc_pka_key *k, const password_ctx *pw_ctx)
237+
{
238+
int err = pem_decode_pkcs_filehandle(f, k, pw_ctx);
239+
if (err == CRYPT_OK || err != CRYPT_UNKNOWN_PEM)
240+
return err;
241+
#if defined(LTC_SSH)
242+
rewind(f);
243+
err = pem_decode_openssh_filehandle(f, k, pw_ctx);
244+
#endif
245+
return err;
246+
}
247+
248+
int pem_decode(const void *buf, unsigned long len, ltc_pka_key *k, const password_ctx *pw_ctx)
249+
{
250+
int err = pem_decode_pkcs(buf, len, k, pw_ctx);
251+
if (err == CRYPT_OK || err != CRYPT_UNKNOWN_PEM)
252+
return err;
253+
#if defined(LTC_SSH)
254+
err = pem_decode_openssh(buf, len, k, pw_ctx);
255+
#endif
256+
return err;
257+
}
258+
236259
#endif /* LTC_PEM */

src/misc/pem/pem_pkcs.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ static int s_decode(struct get_char *g, ltc_pka_key *k, const password_ctx *pw_c
215215
goto retry;
216216
} else if (err == CRYPT_OK) {
217217
break;
218+
} else if (err != CRYPT_UNKNOWN_PEM) {
219+
goto cleanup;
218220
}
219221
hdr.id = NULL;
220222
}

src/misc/pem/pem_read.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ int pem_read(void *pem, unsigned long *w, struct pem_headers *hdr, struct get_ch
170170
}
171171
if (hdr->id->start.len != linelen || XMEMCMP(buf, hdr->id->start.p, hdr->id->start.len)) {
172172
s_unget_line(buf, linelen, g);
173-
return CRYPT_INVALID_PACKET;
173+
return CRYPT_UNKNOWN_PEM;
174174
}
175175

176176
hdr->encrypted = hdr->id->flags & pf_encrypted;

src/misc/pem/pem_ssh.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,8 @@ static int s_decode_openssh(struct get_char *g, ltc_pka_key *k, const password_c
537537
goto retry;
538538
} else if (err == CRYPT_OK) {
539539
break;
540+
} else if (err != CRYPT_UNKNOWN_PEM) {
541+
goto cleanup;
540542
}
541543
hdr.id = NULL;
542544
}

tests/common.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ int test_process_dir(const char *path, void *ctx, dir_iter_cb iter, dir_fiter_cb
161161
#if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 1
162162
fprintf(stderr, "%s: Skip: %s\n", test, fname);
163163
#endif
164+
err = CRYPT_OK;
164165
goto continue_loop;
165166
} else if (err != CRYPT_OK) {
166167
#if defined(LTC_TEST_DBG)
@@ -170,7 +171,7 @@ int test_process_dir(const char *path, void *ctx, dir_iter_cb iter, dir_fiter_cb
170171
#endif
171172
break;
172173
}
173-
if ((err != CRYPT_NOP) && (cleanup != NULL)) {
174+
if (cleanup != NULL) {
174175
cleanup(ctx);
175176
}
176177

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
-----BEGIN OPENSSH PRIVATE KEY-----
2+
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
49+
-----END OPENSSH PRIVATE KEY-----
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
-----BEGIN OPENSSH PRIVATE KEY-----
2+
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
49+
eF7XqLa7SIo0XBe/NQOsuEVlQ=
50+
-----END OPENSSH PRIVATE KEY-----

0 commit comments

Comments
 (0)