test_suite_pkcs7.function 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. /* BEGIN_HEADER */
  2. #include "mbedtls/bignum.h"
  3. #include "mbedtls/pkcs7.h"
  4. #include "mbedtls/x509.h"
  5. #include "mbedtls/x509_crt.h"
  6. #include "mbedtls/x509_crl.h"
  7. #include "mbedtls/oid.h"
  8. #include "sys/types.h"
  9. #include "sys/stat.h"
  10. #include "mbedtls/rsa.h"
  11. /* END_HEADER */
  12. /* BEGIN_DEPENDENCIES
  13. * depends_on:MBEDTLS_PKCS7_C
  14. * END_DEPENDENCIES
  15. */
  16. /* BEGIN_SUITE_HELPERS */
  17. int pkcs7_parse_buffer(unsigned char *pkcs7_buf, int buflen)
  18. {
  19. int res;
  20. mbedtls_pkcs7 pkcs7;
  21. mbedtls_pkcs7_init(&pkcs7);
  22. res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
  23. mbedtls_pkcs7_free(&pkcs7);
  24. return res;
  25. }
  26. /* END_SUITE_HELPERS */
  27. /* BEGIN_CASE */
  28. void pkcs7_asn1_fail(data_t *pkcs7_buf)
  29. {
  30. int res;
  31. res = pkcs7_parse_buffer(pkcs7_buf->x, pkcs7_buf->len);
  32. TEST_ASSERT(res != MBEDTLS_PKCS7_SIGNED_DATA);
  33. }
  34. /* END_CASE */
  35. /* BEGIN_CASE depends_on:MBEDTLS_FS_IO */
  36. void pkcs7_parse(char *pkcs7_file, int res_expect)
  37. {
  38. unsigned char *pkcs7_buf = NULL;
  39. size_t buflen;
  40. int res;
  41. res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
  42. TEST_EQUAL(res, 0);
  43. res = pkcs7_parse_buffer(pkcs7_buf, buflen);
  44. TEST_EQUAL(res, res_expect);
  45. exit:
  46. mbedtls_free(pkcs7_buf);
  47. }
  48. /* END_CASE */
  49. /* BEGIN_CASE depends_on:MBEDTLS_FS_IO:MBEDTLS_X509_CRT_PARSE_C:MBEDTLS_PKCS1_V15:MBEDTLS_RSA_C */
  50. void pkcs7_verify(char *pkcs7_file,
  51. char *crt_files,
  52. char *filetobesigned,
  53. int do_hash_alg,
  54. int res_expect)
  55. {
  56. unsigned char *pkcs7_buf = NULL;
  57. size_t buflen, i, k, cnt = 0, n_crts = 1;
  58. unsigned char *data = NULL;
  59. char **crt_files_arr = NULL;
  60. unsigned char *hash = NULL;
  61. struct stat st;
  62. size_t datalen;
  63. int res;
  64. FILE *file;
  65. const mbedtls_md_info_t *md_info;
  66. mbedtls_pkcs7 pkcs7;
  67. mbedtls_x509_crt **crts = NULL;
  68. /* crt_files are space seprated list */
  69. for (i = 0; i < strlen(crt_files); i++) {
  70. if (crt_files[i] == ' ') {
  71. n_crts++;
  72. }
  73. }
  74. ASSERT_ALLOC(crts, sizeof(*crts)*n_crts);
  75. ASSERT_ALLOC(crt_files_arr, sizeof(*crt_files_arr)*n_crts);
  76. for (i = 0; i < strlen(crt_files); i++) {
  77. for (k = i; k < strlen(crt_files); k++) {
  78. if (crt_files[k] == ' ') {
  79. break;
  80. }
  81. }
  82. ASSERT_ALLOC(crt_files_arr[cnt], (k-i)+1);
  83. crt_files_arr[cnt][k-i] = '\0';
  84. memcpy(crt_files_arr[cnt++], crt_files + i, k-i);
  85. i = k;
  86. }
  87. mbedtls_pkcs7_init(&pkcs7);
  88. for (i = 0; i < n_crts; i++) {
  89. ASSERT_ALLOC(crts[i], sizeof(*crts[i]));
  90. mbedtls_x509_crt_init(crts[i]);
  91. }
  92. USE_PSA_INIT();
  93. res = mbedtls_pk_load_file(pkcs7_file, &pkcs7_buf, &buflen);
  94. TEST_EQUAL(res, 0);
  95. res = mbedtls_pkcs7_parse_der(&pkcs7, pkcs7_buf, buflen);
  96. TEST_EQUAL(res, MBEDTLS_PKCS7_SIGNED_DATA);
  97. TEST_EQUAL(pkcs7.signed_data.no_of_signers, n_crts);
  98. for (i = 0; i < n_crts; i++) {
  99. res = mbedtls_x509_crt_parse_file(crts[i], crt_files_arr[i]);
  100. TEST_EQUAL(res, 0);
  101. }
  102. res = stat(filetobesigned, &st);
  103. TEST_EQUAL(res, 0);
  104. file = fopen(filetobesigned, "rb");
  105. TEST_ASSERT(file != NULL);
  106. datalen = st.st_size;
  107. /* Special-case for zero-length input so that data will be non-NULL */
  108. ASSERT_ALLOC(data, datalen == 0 ? 1 : datalen);
  109. buflen = fread((void *) data, sizeof(unsigned char), datalen, file);
  110. TEST_EQUAL(buflen, datalen);
  111. fclose(file);
  112. if (do_hash_alg) {
  113. md_info = mbedtls_md_info_from_type((mbedtls_md_type_t) do_hash_alg);
  114. ASSERT_ALLOC(hash, mbedtls_md_get_size(md_info));
  115. res = mbedtls_md(md_info, data, datalen, hash);
  116. TEST_EQUAL(res, 0);
  117. for (i = 0; i < n_crts; i++) {
  118. res =
  119. mbedtls_pkcs7_signed_hash_verify(&pkcs7, crts[i], hash,
  120. mbedtls_md_get_size(md_info));
  121. TEST_EQUAL(res, res_expect);
  122. }
  123. } else {
  124. for (i = 0; i < n_crts; i++) {
  125. res = mbedtls_pkcs7_signed_data_verify(&pkcs7, crts[i], data, datalen);
  126. TEST_EQUAL(res, res_expect);
  127. }
  128. }
  129. exit:
  130. for (i = 0; i < n_crts; i++) {
  131. mbedtls_x509_crt_free(crts[i]);
  132. mbedtls_free(crts[i]);
  133. mbedtls_free(crt_files_arr[i]);
  134. }
  135. mbedtls_free(hash);
  136. mbedtls_pkcs7_free(&pkcs7);
  137. mbedtls_free(crt_files_arr);
  138. mbedtls_free(crts);
  139. mbedtls_free(data);
  140. mbedtls_free(pkcs7_buf);
  141. USE_PSA_DONE();
  142. }
  143. /* END_CASE */