blob: 36801d14a12dc510a07f9a1a9aa0c6edb2b390fb [file] [log] [blame]
Paul Bakker16300582014-04-11 13:28:43 +02001/* BEGIN_HEADER */
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +00002#include "mbedtls/base64.h"
3#include "mbedtls/pem.h"
Andres AGa3b9adb2017-03-01 11:53:29 +00004#include "mbedtls/des.h"
5#include "mbedtls/aes.h"
Paul Bakker16300582014-04-11 13:28:43 +02006/* END_HEADER */
7
Andres AG9c94b692016-10-24 14:31:54 +01008/* BEGIN_CASE depends_on:MBEDTLS_PEM_WRITE_C */
Gilles Peskine449bd832023-01-11 14:50:10 +01009void mbedtls_pem_write_buffer(char *start, char *end, data_t *buf,
10 char *result_str)
Paul Bakker16300582014-04-11 13:28:43 +020011{
Paul Bakkerbd51b262014-07-10 15:26:12 +020012 unsigned char *check_buf = NULL;
Paul Bakker16300582014-04-11 13:28:43 +020013 int ret;
Azim Khanf1aaec92017-05-30 14:23:15 +010014 size_t olen = 0, olen2 = 0;
Paul Bakker16300582014-04-11 13:28:43 +020015
Paul Bakker16300582014-04-11 13:28:43 +020016
Gilles Peskine449bd832023-01-11 14:50:10 +010017 ret = mbedtls_pem_write_buffer(start, end, buf->x, buf->len, NULL, 0, &olen);
18 TEST_ASSERT(ret == MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL);
Paul Bakker16300582014-04-11 13:28:43 +020019
Gilles Peskine449bd832023-01-11 14:50:10 +010020 check_buf = (unsigned char *) mbedtls_calloc(1, olen);
21 TEST_ASSERT(check_buf != NULL);
Paul Bakker16300582014-04-11 13:28:43 +020022
Gilles Peskine449bd832023-01-11 14:50:10 +010023 ret = mbedtls_pem_write_buffer(start, end, buf->x, buf->len, check_buf, olen, &olen2);
Paul Bakker16300582014-04-11 13:28:43 +020024
Gilles Peskine449bd832023-01-11 14:50:10 +010025 TEST_ASSERT(olen2 <= olen);
26 TEST_ASSERT(olen > strlen((char *) result_str));
27 TEST_ASSERT(ret == 0);
28 TEST_ASSERT(strncmp((char *) check_buf, (char *) result_str, olen) == 0);
Paul Bakkerbd51b262014-07-10 15:26:12 +020029
30exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010031 mbedtls_free(check_buf);
Paul Bakker16300582014-04-11 13:28:43 +020032}
33/* END_CASE */
Andres AG9c94b692016-10-24 14:31:54 +010034
Jethro Beekman746df882023-05-03 14:49:28 +020035/* BEGIN_CASE depends_on:MBEDTLS_PEM_WRITE_C */
36void mbedtls_pem_write_buffer_lengths()
37{
38 unsigned char data[256] = {};
39 unsigned char buf[1024];
40 size_t olen_needed, olen;
41 int ret;
42 for (size_t l = 0; l <= sizeof(data); l++) {
43 ret = mbedtls_pem_write_buffer("\n", "\n", data, l, NULL, 0, &olen_needed);
44 TEST_ASSERT(ret == MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL);
45
46 /* Test that a bigger buffer still only requires `olen_needed` */
47 ret = mbedtls_pem_write_buffer("\n", "\n", data, l, buf, sizeof(buf), &olen);
48 TEST_ASSERT(ret == 0);
49 TEST_ASSERT(olen_needed == olen);
50
51 /* Test that a buffer of exactly `olen_needed` works */
52 memset(buf, 1, sizeof(buf));
53 ret = mbedtls_pem_write_buffer("\n", "\n", data, l, buf, olen_needed, &olen);
54 TEST_ASSERT(ret == 0);
55 TEST_ASSERT(olen_needed == olen);
56 /* Test the function didn't overflow the given buffer */
57 for (size_t i = olen_needed; i < sizeof(buf); i++) {
58 TEST_ASSERT(buf[i] == 1);
59 }
60 }
61}
62/* END_CASE */
63
Przemek Stekielbc0509a2022-08-10 15:10:15 +020064/* BEGIN_CASE depends_on:MBEDTLS_PEM_PARSE_C */
Gilles Peskine449bd832023-01-11 14:50:10 +010065void mbedtls_pem_read_buffer(char *header, char *footer, char *data,
66 char *pwd, int res, data_t *out)
Andres AG9c94b692016-10-24 14:31:54 +010067{
68 mbedtls_pem_context ctx;
Andres AGa3b9adb2017-03-01 11:53:29 +000069 int ret;
Andres AG9c94b692016-10-24 14:31:54 +010070 size_t use_len = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010071 size_t pwd_len = strlen(pwd);
Glenn Strauss72bd4e42022-02-04 10:32:17 -050072 const unsigned char *buf;
Andres AG9c94b692016-10-24 14:31:54 +010073
Manuel Pégourié-Gonnard1c2008f2023-03-16 10:20:29 +010074 MD_PSA_INIT();
75
Gilles Peskine449bd832023-01-11 14:50:10 +010076 mbedtls_pem_init(&ctx);
Andres AG9c94b692016-10-24 14:31:54 +010077
Gilles Peskine449bd832023-01-11 14:50:10 +010078 ret = mbedtls_pem_read_buffer(&ctx, header, footer, (unsigned char *) data,
79 (unsigned char *) pwd, pwd_len, &use_len);
80 TEST_ASSERT(ret == res);
81 if (ret != 0) {
Glenn Strauss72bd4e42022-02-04 10:32:17 -050082 goto exit;
Gilles Peskine449bd832023-01-11 14:50:10 +010083 }
Glenn Strauss72bd4e42022-02-04 10:32:17 -050084
Glenn Strauss72bd4e42022-02-04 10:32:17 -050085 use_len = 0;
Gilles Peskine449bd832023-01-11 14:50:10 +010086 buf = mbedtls_pem_get_buffer(&ctx, &use_len);
87 TEST_EQUAL(use_len, out->len);
88 TEST_ASSERT(memcmp(out->x, buf, out->len) == 0);
Andres AG9c94b692016-10-24 14:31:54 +010089
90exit:
Gilles Peskine449bd832023-01-11 14:50:10 +010091 mbedtls_pem_free(&ctx);
Manuel Pégourié-Gonnard1c2008f2023-03-16 10:20:29 +010092 MD_PSA_DONE();
Andres AG9c94b692016-10-24 14:31:54 +010093}
94/* END_CASE */