| /* BEGIN_HEADER */ |
| #include "mbedtls/pk.h" |
| #include "mbedtls/pem.h" |
| #include "mbedtls/oid.h" |
| |
| typedef enum { |
| TEST_PEM, |
| TEST_DER |
| } pkwrite_file_format_t; |
| |
| static void pk_write_check_common(char *key_file, int is_public_key, int is_der) |
| { |
| mbedtls_pk_context key; |
| unsigned char *buf = NULL; |
| unsigned char *check_buf = NULL; |
| unsigned char *start_buf; |
| size_t buf_len, check_buf_len; |
| int ret; |
| |
| /* Note: if mbedtls_pk_load_file() successfully reads the file, then |
| it also allocates check_buf, which should be freed on exit */ |
| TEST_EQUAL(mbedtls_pk_load_file(key_file, &check_buf, &check_buf_len), 0); |
| TEST_ASSERT(check_buf_len > 0); |
| |
| ASSERT_ALLOC(buf, check_buf_len); |
| |
| mbedtls_pk_init(&key); |
| if (is_public_key) { |
| TEST_EQUAL(mbedtls_pk_parse_public_keyfile(&key, key_file), 0); |
| if (is_der) { |
| ret = mbedtls_pk_write_pubkey_der(&key, buf, check_buf_len); |
| } else { |
| ret = mbedtls_pk_write_pubkey_pem(&key, buf, check_buf_len); |
| } |
| } else { |
| TEST_EQUAL(mbedtls_pk_parse_keyfile(&key, key_file, NULL, |
| mbedtls_test_rnd_std_rand, NULL), 0); |
| if (is_der) { |
| ret = mbedtls_pk_write_key_der(&key, buf, check_buf_len); |
| } else { |
| ret = mbedtls_pk_write_key_pem(&key, buf, check_buf_len); |
| } |
| } |
| |
| if (is_der) { |
| TEST_LE_U(1, ret); |
| buf_len = ret; |
| start_buf = buf + check_buf_len - buf_len; |
| } else { |
| TEST_EQUAL(ret, 0); |
| buf_len = check_buf_len; |
| start_buf = buf; |
| } |
| |
| ASSERT_COMPARE(start_buf, buf_len, check_buf, check_buf_len); |
| |
| exit: |
| mbedtls_free(buf); |
| mbedtls_free(check_buf); |
| mbedtls_pk_free(&key); |
| } |
| /* END_HEADER */ |
| |
| /* BEGIN_DEPENDENCIES |
| * depends_on:MBEDTLS_PK_PARSE_C:MBEDTLS_PK_WRITE_C:MBEDTLS_BIGNUM_C:MBEDTLS_FS_IO |
| * END_DEPENDENCIES |
| */ |
| |
| /* BEGIN_CASE depends_on:MBEDTLS_PEM_WRITE_C */ |
| void pk_write_pubkey_check(char *key_file, int is_der) |
| { |
| pk_write_check_common(key_file, 1, is_der); |
| goto exit; /* make the compiler happy */ |
| } |
| /* END_CASE */ |
| |
| /* BEGIN_CASE depends_on:MBEDTLS_PEM_WRITE_C */ |
| void pk_write_key_check(char *key_file, int is_der) |
| { |
| pk_write_check_common(key_file, 0, is_der); |
| goto exit; /* make the compiler happy */ |
| } |
| /* END_CASE */ |