1/*
2 * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License 2.0 (the "License").  You may not use
5 * this file except in compliance with the License.  You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
8 */
9
10#include <stdio.h>
11#include <string.h>
12#include <stdlib.h>
13
14#include "internal/nelem.h"
15
16#include <openssl/pkcs12.h>
17#include <openssl/x509.h>
18#include <openssl/x509v3.h>
19#include <openssl/pem.h>
20
21#include "testutil.h"
22#include "helpers/pkcs12.h"
23
24static int default_libctx = 1;
25
26static OSSL_LIB_CTX *testctx = NULL;
27static OSSL_PROVIDER *nullprov = NULL;
28static OSSL_PROVIDER *deflprov = NULL;
29static OSSL_PROVIDER *lgcyprov = NULL;
30
31/* --------------------------------------------------------------------------
32 * PKCS12 component test data
33 */
34
35static const unsigned char CERT1[] =
36{
37    0x30, 0x82, 0x01, 0xed, 0x30, 0x82, 0x01, 0x56, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00,
38    0x8b, 0x4b, 0x5e, 0x6c, 0x03, 0x28, 0x4e, 0xe6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
39    0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x19, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55,
40    0x04, 0x03, 0x0c, 0x0e, 0x50, 0x31, 0x32, 0x54, 0x65, 0x73, 0x74, 0x2d, 0x52, 0x6f, 0x6f, 0x74,
41    0x2d, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x39, 0x33, 0x30, 0x30, 0x30, 0x34, 0x36,
42    0x35, 0x36, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x39, 0x32, 0x37, 0x30, 0x30, 0x34, 0x36, 0x35,
43    0x36, 0x5a, 0x30, 0x1b, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x10, 0x50,
44    0x31, 0x32, 0x54, 0x65, 0x73, 0x74, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x31, 0x30,
45    0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
46    0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xbc, 0xdc, 0x6f, 0x8c,
47    0x7a, 0x2a, 0x4b, 0xea, 0x66, 0x66, 0x04, 0xa9, 0x05, 0x92, 0x53, 0xd7, 0x13, 0x3c, 0x49, 0xe1,
48    0xc8, 0xbb, 0xdf, 0x3d, 0xcb, 0x88, 0x31, 0x07, 0x20, 0x59, 0x93, 0x24, 0x7f, 0x7d, 0xc6, 0x84,
49    0x81, 0x16, 0x64, 0x4a, 0x52, 0xa6, 0x30, 0x44, 0xdc, 0x1a, 0x30, 0xde, 0xae, 0x29, 0x18, 0xcf,
50    0xc7, 0xf3, 0xcf, 0x0c, 0xb7, 0x8e, 0x2b, 0x1e, 0x21, 0x01, 0x0b, 0xfb, 0xe5, 0xe6, 0xcf, 0x2b,
51    0x84, 0xe1, 0x33, 0xf8, 0xba, 0x02, 0xfc, 0x30, 0xfa, 0xc4, 0x33, 0xc7, 0x37, 0xc6, 0x7f, 0x72,
52    0x31, 0x92, 0x1d, 0x8f, 0xa0, 0xfb, 0xe5, 0x4a, 0x08, 0x31, 0x78, 0x80, 0x9c, 0x23, 0xb4, 0xe9,
53    0x19, 0x56, 0x04, 0xfa, 0x0d, 0x07, 0x04, 0xb7, 0x43, 0xac, 0x4c, 0x49, 0x7c, 0xc2, 0xa1, 0x44,
54    0xc1, 0x48, 0x7d, 0x28, 0xe5, 0x23, 0x66, 0x07, 0x22, 0xd5, 0xf0, 0xf1, 0x02, 0x03, 0x01, 0x00,
55    0x01, 0xa3, 0x3b, 0x30, 0x39, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16,
56    0x80, 0x14, 0xdb, 0xbb, 0xb8, 0x92, 0x4e, 0x24, 0x0b, 0x1b, 0xbb, 0x78, 0x33, 0xf9, 0x01, 0x02,
57    0x23, 0x0d, 0x96, 0x18, 0x30, 0x47, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30,
58    0x00, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x04, 0xf0, 0x30, 0x0d,
59    0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x81, 0x81,
60    0x00, 0x1c, 0x13, 0xdc, 0x02, 0xf1, 0x44, 0x36, 0x65, 0xa9, 0xbe, 0x30, 0x1c, 0x66, 0x14, 0x20,
61    0x86, 0x5a, 0xa8, 0x69, 0x25, 0xf8, 0x1a, 0xb6, 0x9e, 0x5e, 0xe9, 0x89, 0xb8, 0x67, 0x70, 0x19,
62    0x87, 0x60, 0xeb, 0x4b, 0x11, 0x71, 0x85, 0xf8, 0xe9, 0xa7, 0x3e, 0x20, 0x42, 0xec, 0x43, 0x25,
63    0x01, 0x03, 0xe5, 0x4d, 0x83, 0x22, 0xf5, 0x8e, 0x3a, 0x1a, 0x1b, 0xd4, 0x1c, 0xda, 0x6b, 0x9d,
64    0x10, 0x1b, 0xee, 0x67, 0x4e, 0x1f, 0x69, 0xab, 0xbc, 0xaa, 0x62, 0x8e, 0x9e, 0xc6, 0xee, 0xd6,
65    0x09, 0xc0, 0xca, 0xe0, 0xaa, 0x9f, 0x07, 0xb2, 0xc2, 0xbb, 0x31, 0x96, 0xa2, 0x04, 0x62, 0xd3,
66    0x13, 0x32, 0x29, 0x67, 0x6e, 0xad, 0x2e, 0x0b, 0xea, 0x04, 0x7c, 0x8c, 0x5a, 0x5d, 0xac, 0x14,
67    0xaa, 0x61, 0x7f, 0x28, 0x6c, 0x2d, 0x64, 0x2d, 0xc3, 0xaf, 0x77, 0x52, 0x90, 0xb4, 0x37, 0xc0,
68    0x30,
69};
70
71static const unsigned char CERT2[] =
72{
73    0x30, 0x82, 0x01, 0xed, 0x30, 0x82, 0x01, 0x56, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00,
74    0x8b, 0x4b, 0x5e, 0x6c, 0x03, 0x28, 0x4e, 0xe7, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
75    0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x19, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55,
76    0x04, 0x03, 0x0c, 0x0e, 0x50, 0x31, 0x32, 0x54, 0x65, 0x73, 0x74, 0x2d, 0x52, 0x6f, 0x6f, 0x74,
77    0x2d, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x39, 0x30, 0x39, 0x33, 0x30, 0x30, 0x30, 0x34, 0x36,
78    0x35, 0x36, 0x5a, 0x17, 0x0d, 0x32, 0x39, 0x30, 0x39, 0x32, 0x37, 0x30, 0x30, 0x34, 0x36, 0x35,
79    0x36, 0x5a, 0x30, 0x1b, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x10, 0x50,
80    0x31, 0x32, 0x54, 0x65, 0x73, 0x74, 0x2d, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x31, 0x30,
81    0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
82    0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xa8, 0x6e, 0x40, 0x86,
83    0x9f, 0x98, 0x59, 0xfb, 0x57, 0xbf, 0xc1, 0x55, 0x12, 0x38, 0xeb, 0xb3, 0x46, 0x34, 0xc9, 0x35,
84    0x4d, 0xfd, 0x03, 0xe9, 0x3a, 0x88, 0x9e, 0x97, 0x8f, 0xf4, 0xec, 0x36, 0x7b, 0x3f, 0xba, 0xb8,
85    0xa5, 0x96, 0x30, 0x03, 0xc5, 0xc6, 0xd9, 0xa8, 0x4e, 0xbc, 0x23, 0x51, 0xa1, 0x96, 0xd2, 0x03,
86    0x98, 0x73, 0xb6, 0x17, 0x9c, 0x77, 0xd4, 0x95, 0x1e, 0x1b, 0xb3, 0x1b, 0xc8, 0x71, 0xd1, 0x2e,
87    0x31, 0xc7, 0x6a, 0x75, 0x57, 0x08, 0x7f, 0xba, 0x70, 0x76, 0xf7, 0x67, 0xf4, 0x4e, 0xbe, 0xfc,
88    0x70, 0x61, 0x41, 0x07, 0x2b, 0x7c, 0x3c, 0x3b, 0xb3, 0xbc, 0xd5, 0xa8, 0xbd, 0x28, 0xd8, 0x49,
89    0xd3, 0xe1, 0x78, 0xc8, 0xc1, 0x42, 0x5e, 0x18, 0x36, 0xa8, 0x41, 0xf7, 0xc8, 0xaa, 0x35, 0xfe,
90    0x2d, 0xd1, 0xb4, 0xcc, 0x00, 0x67, 0xae, 0x79, 0xd3, 0x28, 0xd5, 0x5b, 0x02, 0x03, 0x01, 0x00,
91    0x01, 0xa3, 0x3b, 0x30, 0x39, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16,
92    0x80, 0x14, 0xdb, 0xbb, 0xb8, 0x92, 0x4e, 0x24, 0x0b, 0x1b, 0xbb, 0x78, 0x33, 0xf9, 0x01, 0x02,
93    0x23, 0x0d, 0x96, 0x18, 0x30, 0x47, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30,
94    0x00, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x04, 0xf0, 0x30, 0x0d,
95    0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x81, 0x81,
96    0x00, 0x3b, 0xa6, 0x73, 0xbe, 0xe0, 0x28, 0xed, 0x1f, 0x29, 0x78, 0x4c, 0xc0, 0x1f, 0xe9, 0x85,
97    0xc6, 0x8f, 0xe3, 0x87, 0x7c, 0xd9, 0xe7, 0x0a, 0x37, 0xe8, 0xaa, 0xb5, 0xd2, 0x7f, 0xf8, 0x90,
98    0x20, 0x80, 0x35, 0xa7, 0x79, 0x2b, 0x04, 0xa7, 0xbf, 0xe6, 0x7b, 0x58, 0xcb, 0xec, 0x0e, 0x58,
99    0xef, 0x2a, 0x70, 0x8a, 0x56, 0x8a, 0xcf, 0x6b, 0x7a, 0x74, 0x0c, 0xf4, 0x15, 0x37, 0x93, 0xcd,
100    0xe6, 0xb2, 0xa1, 0x83, 0x09, 0xdb, 0x9e, 0x4f, 0xff, 0x6a, 0x17, 0x4f, 0x33, 0xc9, 0xcc, 0x90,
101    0x2a, 0x67, 0xff, 0x16, 0x78, 0xa8, 0x2c, 0x10, 0xe0, 0x52, 0x8c, 0xe6, 0xe9, 0x90, 0x8d, 0xe0,
102    0x62, 0x04, 0x9a, 0x0f, 0x44, 0x01, 0x82, 0x14, 0x92, 0x44, 0x25, 0x69, 0x22, 0xb7, 0xb8, 0xc5,
103    0x94, 0x4c, 0x4b, 0x1c, 0x9b, 0x92, 0x60, 0x66, 0x90, 0x4e, 0xb9, 0xa8, 0x4c, 0x89, 0xbb, 0x0f,
104    0x0b,
105};
106
107static const unsigned char KEY1[] =
108{
109    0x30, 0x82, 0x02, 0x5d, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xbc, 0xdc, 0x6f, 0x8c, 0x7a,
110    0x2a, 0x4b, 0xea, 0x66, 0x66, 0x04, 0xa9, 0x05, 0x92, 0x53, 0xd7, 0x13, 0x3c, 0x49, 0xe1, 0xc8,
111    0xbb, 0xdf, 0x3d, 0xcb, 0x88, 0x31, 0x07, 0x20, 0x59, 0x93, 0x24, 0x7f, 0x7d, 0xc6, 0x84, 0x81,
112    0x16, 0x64, 0x4a, 0x52, 0xa6, 0x30, 0x44, 0xdc, 0x1a, 0x30, 0xde, 0xae, 0x29, 0x18, 0xcf, 0xc7,
113    0xf3, 0xcf, 0x0c, 0xb7, 0x8e, 0x2b, 0x1e, 0x21, 0x01, 0x0b, 0xfb, 0xe5, 0xe6, 0xcf, 0x2b, 0x84,
114    0xe1, 0x33, 0xf8, 0xba, 0x02, 0xfc, 0x30, 0xfa, 0xc4, 0x33, 0xc7, 0x37, 0xc6, 0x7f, 0x72, 0x31,
115    0x92, 0x1d, 0x8f, 0xa0, 0xfb, 0xe5, 0x4a, 0x08, 0x31, 0x78, 0x80, 0x9c, 0x23, 0xb4, 0xe9, 0x19,
116    0x56, 0x04, 0xfa, 0x0d, 0x07, 0x04, 0xb7, 0x43, 0xac, 0x4c, 0x49, 0x7c, 0xc2, 0xa1, 0x44, 0xc1,
117    0x48, 0x7d, 0x28, 0xe5, 0x23, 0x66, 0x07, 0x22, 0xd5, 0xf0, 0xf1, 0x02, 0x03, 0x01, 0x00, 0x01,
118    0x02, 0x81, 0x81, 0x00, 0xa5, 0x6d, 0xf9, 0x8f, 0xf5, 0x5a, 0xa3, 0x50, 0xd9, 0x0d, 0x37, 0xbb,
119    0xce, 0x13, 0x94, 0xb8, 0xea, 0x32, 0x7f, 0x0c, 0xf5, 0x46, 0x0b, 0x90, 0x17, 0x7e, 0x5e, 0x63,
120    0xbd, 0xa4, 0x78, 0xcd, 0x19, 0x97, 0xd4, 0x92, 0x30, 0x78, 0xaa, 0xb4, 0xa7, 0x9c, 0xc6, 0xdf,
121    0x2a, 0x65, 0x0e, 0xb5, 0x9f, 0x9c, 0x84, 0x0d, 0x4d, 0x3a, 0x74, 0xfc, 0xd0, 0xb4, 0x09, 0x74,
122    0xc4, 0xb8, 0x24, 0x03, 0xa8, 0xf0, 0xf8, 0x0d, 0x5c, 0x8e, 0xdf, 0x4b, 0xe1, 0x0a, 0x8f, 0x4f,
123    0xd5, 0xc7, 0x9b, 0x54, 0x55, 0x8f, 0x00, 0x5c, 0xea, 0x4c, 0x73, 0xf9, 0x1b, 0xbf, 0xb8, 0x93,
124    0x33, 0x20, 0xce, 0x45, 0xd9, 0x03, 0x02, 0xb2, 0x36, 0xc5, 0x0a, 0x30, 0x50, 0x78, 0x80, 0x66,
125    0x00, 0x22, 0x38, 0x86, 0xcf, 0x63, 0x4a, 0x5c, 0xbf, 0x2b, 0xd9, 0x6e, 0xe6, 0xf0, 0x39, 0xad,
126    0x12, 0x25, 0x41, 0xb9, 0x02, 0x41, 0x00, 0xf3, 0x7c, 0x07, 0x99, 0x64, 0x3a, 0x28, 0x8c, 0x8d,
127    0x05, 0xfe, 0x32, 0xb5, 0x4c, 0x8c, 0x6d, 0xde, 0x3d, 0x16, 0x08, 0xa0, 0x01, 0x61, 0x4f, 0x8e,
128    0xa0, 0xf7, 0x26, 0x26, 0xb5, 0x8e, 0xc0, 0x7a, 0xce, 0x86, 0x34, 0xde, 0xb8, 0xef, 0x86, 0x01,
129    0xbe, 0x24, 0xaa, 0x9b, 0x36, 0x93, 0x72, 0x9b, 0xf9, 0xc6, 0xcb, 0x76, 0x84, 0x67, 0x06, 0x06,
130    0x30, 0x50, 0xdf, 0x42, 0x17, 0xe0, 0xa7, 0x02, 0x41, 0x00, 0xc6, 0x91, 0xa0, 0x41, 0x34, 0x11,
131    0x67, 0x4b, 0x08, 0x0f, 0xda, 0xa7, 0x99, 0xec, 0x58, 0x11, 0xa5, 0x82, 0xdb, 0x50, 0xfe, 0x77,
132    0xe2, 0xd1, 0x53, 0x9c, 0x7d, 0xe8, 0xbf, 0xe7, 0x7c, 0xa9, 0x01, 0xb1, 0x87, 0xc3, 0x52, 0x79,
133    0x9e, 0x2c, 0xa7, 0x6f, 0x02, 0x37, 0x32, 0xef, 0x24, 0x31, 0x21, 0x0b, 0x86, 0x05, 0x32, 0x4a,
134    0x2e, 0x0b, 0x65, 0x05, 0xd3, 0xd6, 0x30, 0xb2, 0xfc, 0xa7, 0x02, 0x41, 0x00, 0xc2, 0xed, 0x31,
135    0xdc, 0x40, 0x9c, 0x3a, 0xe8, 0x42, 0xe2, 0x60, 0x5e, 0x52, 0x3c, 0xc5, 0x54, 0x14, 0x0e, 0x8d,
136    0x7c, 0x3c, 0x34, 0xbe, 0xa6, 0x05, 0x86, 0xa2, 0x36, 0x5d, 0xd9, 0x0e, 0x3e, 0xd4, 0x52, 0x50,
137    0xa9, 0x35, 0x01, 0x93, 0x68, 0x92, 0x2e, 0x9a, 0x86, 0x27, 0x1a, 0xab, 0x32, 0x9e, 0xe2, 0x79,
138    0x9f, 0x5b, 0xf3, 0xa5, 0xd2, 0xf1, 0xd3, 0x6e, 0x7b, 0x3e, 0x1b, 0x85, 0x93, 0x02, 0x40, 0x68,
139    0xb8, 0xb6, 0x7e, 0x8c, 0xba, 0x3c, 0xf2, 0x8a, 0x2e, 0xea, 0x4f, 0x07, 0xd3, 0x68, 0x62, 0xee,
140    0x1a, 0x04, 0x16, 0x44, 0x0d, 0xef, 0xf6, 0x1b, 0x95, 0x65, 0xa5, 0xd1, 0x47, 0x81, 0x2c, 0x14,
141    0xb3, 0x8e, 0xf9, 0x08, 0xcf, 0x11, 0x07, 0x55, 0xca, 0x2a, 0xad, 0xf7, 0xd3, 0xbd, 0x0f, 0x97,
142    0xf0, 0xde, 0xde, 0x70, 0xb6, 0x44, 0x70, 0x47, 0xf7, 0xf9, 0xcf, 0x75, 0x61, 0x7f, 0xf3, 0x02,
143    0x40, 0x38, 0x4a, 0x67, 0xaf, 0xae, 0xb6, 0xb2, 0x6a, 0x00, 0x25, 0x5a, 0xa4, 0x65, 0x20, 0xb1,
144    0x13, 0xbd, 0x83, 0xff, 0xb4, 0xbc, 0xf4, 0xdd, 0xa1, 0xbb, 0x1c, 0x96, 0x37, 0x35, 0xf4, 0xbf,
145    0xed, 0x4c, 0xed, 0x92, 0xe8, 0xac, 0xc9, 0xc1, 0xa5, 0xa3, 0x23, 0x66, 0x40, 0x8a, 0xa1, 0xe6,
146    0xe3, 0x95, 0xfe, 0xc4, 0x53, 0xf5, 0x7d, 0x6e, 0xca, 0x45, 0x42, 0xe4, 0xc2, 0x9f, 0xe5, 0x1e,
147    0xb5,
148};
149
150
151static const unsigned char KEY2[] =
152{
153    0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xa8, 0x6e, 0x40, 0x86, 0x9f,
154    0x98, 0x59, 0xfb, 0x57, 0xbf, 0xc1, 0x55, 0x12, 0x38, 0xeb, 0xb3, 0x46, 0x34, 0xc9, 0x35, 0x4d,
155    0xfd, 0x03, 0xe9, 0x3a, 0x88, 0x9e, 0x97, 0x8f, 0xf4, 0xec, 0x36, 0x7b, 0x3f, 0xba, 0xb8, 0xa5,
156    0x96, 0x30, 0x03, 0xc5, 0xc6, 0xd9, 0xa8, 0x4e, 0xbc, 0x23, 0x51, 0xa1, 0x96, 0xd2, 0x03, 0x98,
157    0x73, 0xb6, 0x17, 0x9c, 0x77, 0xd4, 0x95, 0x1e, 0x1b, 0xb3, 0x1b, 0xc8, 0x71, 0xd1, 0x2e, 0x31,
158    0xc7, 0x6a, 0x75, 0x57, 0x08, 0x7f, 0xba, 0x70, 0x76, 0xf7, 0x67, 0xf4, 0x4e, 0xbe, 0xfc, 0x70,
159    0x61, 0x41, 0x07, 0x2b, 0x7c, 0x3c, 0x3b, 0xb3, 0xbc, 0xd5, 0xa8, 0xbd, 0x28, 0xd8, 0x49, 0xd3,
160    0xe1, 0x78, 0xc8, 0xc1, 0x42, 0x5e, 0x18, 0x36, 0xa8, 0x41, 0xf7, 0xc8, 0xaa, 0x35, 0xfe, 0x2d,
161    0xd1, 0xb4, 0xcc, 0x00, 0x67, 0xae, 0x79, 0xd3, 0x28, 0xd5, 0x5b, 0x02, 0x03, 0x01, 0x00, 0x01,
162    0x02, 0x81, 0x81, 0x00, 0xa6, 0x00, 0x83, 0xf8, 0x2b, 0x33, 0xac, 0xfb, 0xdb, 0xf0, 0x52, 0x4b,
163    0xd6, 0x39, 0xe3, 0x94, 0x3d, 0x8d, 0xa9, 0x01, 0xb0, 0x6b, 0xbe, 0x7f, 0x10, 0x01, 0xb6, 0xcd,
164    0x0a, 0x45, 0x0a, 0xca, 0x67, 0x8e, 0xd8, 0x29, 0x44, 0x8a, 0x51, 0xa8, 0x66, 0x35, 0x26, 0x30,
165    0x8b, 0xe9, 0x41, 0xa6, 0x22, 0xec, 0xd2, 0xf0, 0x58, 0x41, 0x33, 0x26, 0xf2, 0x3f, 0xe8, 0x75,
166    0x4f, 0xc7, 0x5d, 0x2e, 0x5a, 0xa8, 0x7a, 0xd2, 0xbf, 0x59, 0xa0, 0x86, 0x79, 0x0b, 0x92, 0x6c,
167    0x95, 0x5d, 0x87, 0x63, 0x5c, 0xd6, 0x1a, 0xc0, 0xf6, 0x7a, 0x15, 0x8d, 0xc7, 0x3c, 0xb6, 0x9e,
168    0xa6, 0x58, 0x46, 0x9b, 0xbf, 0x3e, 0x28, 0x8c, 0xdf, 0x1a, 0x87, 0xaa, 0x7e, 0xf5, 0xf2, 0xcb,
169    0x5e, 0x84, 0x2d, 0xf6, 0x82, 0x7e, 0x89, 0x4e, 0xf5, 0xe6, 0x3c, 0x92, 0x80, 0x1e, 0x98, 0x1c,
170    0x6a, 0x7b, 0x57, 0x01, 0x02, 0x41, 0x00, 0xdd, 0x60, 0x95, 0xd7, 0xa1, 0x9d, 0x0c, 0xa1, 0x84,
171    0xc5, 0x39, 0xca, 0x67, 0x4c, 0x1c, 0x06, 0x71, 0x5b, 0x5c, 0x2d, 0x8d, 0xce, 0xcd, 0xe2, 0x79,
172    0xc8, 0x33, 0xbe, 0x50, 0x37, 0x60, 0x9f, 0x3b, 0xb9, 0x59, 0x55, 0x22, 0x1f, 0xa5, 0x4b, 0x1d,
173    0xca, 0x38, 0xa0, 0xab, 0x87, 0x9c, 0x86, 0x0e, 0xdb, 0x1c, 0x4f, 0x4f, 0x07, 0xed, 0x18, 0x3f,
174    0x05, 0x3c, 0xec, 0x78, 0x11, 0xf6, 0x99, 0x02, 0x41, 0x00, 0xc2, 0xc5, 0xcf, 0xbe, 0x95, 0x91,
175    0xeb, 0xcf, 0x47, 0xf3, 0x33, 0x32, 0xc7, 0x7e, 0x93, 0x56, 0xf7, 0xd8, 0xf9, 0xd4, 0xb6, 0xd6,
176    0x20, 0xac, 0xba, 0x8a, 0x20, 0x19, 0x14, 0xab, 0xc5, 0x5d, 0xb2, 0x08, 0xcc, 0x77, 0x7c, 0x65,
177    0xa8, 0xdb, 0x66, 0x97, 0x36, 0x44, 0x2c, 0x63, 0xc0, 0x6a, 0x7e, 0xb0, 0x0b, 0x5c, 0x90, 0x12,
178    0x50, 0xb4, 0x36, 0x60, 0xc3, 0x1f, 0x22, 0x0c, 0xc8, 0x13, 0x02, 0x40, 0x33, 0xc8, 0x7e, 0x04,
179    0x7c, 0x97, 0x61, 0xf6, 0xfe, 0x39, 0xac, 0x34, 0xfe, 0x48, 0xbd, 0x5d, 0x7c, 0x72, 0xa4, 0x73,
180    0x3b, 0x72, 0x9e, 0x92, 0x55, 0x6e, 0x51, 0x3c, 0x39, 0x43, 0x5a, 0xe4, 0xa4, 0x71, 0xcc, 0xc5,
181    0xaf, 0x3f, 0xbb, 0xc8, 0x80, 0x65, 0x67, 0x2d, 0x9e, 0x32, 0x10, 0x99, 0x03, 0x2c, 0x99, 0xc8,
182    0xab, 0x71, 0xed, 0x31, 0xf8, 0xbb, 0xde, 0xee, 0x69, 0x7f, 0xba, 0x31, 0x02, 0x40, 0x7e, 0xbc,
183    0x60, 0x55, 0x4e, 0xd5, 0xc8, 0x6e, 0xf4, 0x0e, 0x57, 0xbe, 0x2e, 0xf9, 0x39, 0xbe, 0x59, 0x3f,
184    0xa2, 0x30, 0xbb, 0x57, 0xd1, 0xa3, 0x13, 0x2e, 0x55, 0x7c, 0x7c, 0x6a, 0xd8, 0xde, 0x02, 0xbe,
185    0x9e, 0xed, 0x10, 0xd0, 0xc5, 0x73, 0x1d, 0xea, 0x3e, 0xb1, 0x55, 0x81, 0x02, 0xef, 0x48, 0xc8,
186    0x1c, 0x5c, 0x7a, 0x92, 0xb0, 0x58, 0xd3, 0x19, 0x5b, 0x5d, 0xa2, 0xb6, 0x56, 0x69, 0x02, 0x40,
187    0x1e, 0x00, 0x6a, 0x9f, 0xba, 0xee, 0x46, 0x5a, 0xc5, 0xb5, 0x9f, 0x91, 0x33, 0xdd, 0xc9, 0x96,
188    0x75, 0xb7, 0x87, 0xcf, 0x18, 0x1c, 0xb7, 0xb9, 0x3f, 0x04, 0x10, 0xb8, 0x75, 0xa9, 0xb8, 0xa0,
189    0x31, 0x35, 0x03, 0x30, 0x89, 0xc8, 0x37, 0x68, 0x20, 0x30, 0x99, 0x39, 0x96, 0xd6, 0x2b, 0x3d,
190    0x5e, 0x45, 0x84, 0xf7, 0xd2, 0x61, 0x50, 0xc9, 0x50, 0xba, 0x8d, 0x08, 0xaa, 0xd0, 0x08, 0x1e,
191};
192
193
194static const PKCS12_ATTR ATTRS1[] = {
195    { "friendlyName", "george" },
196    { "localKeyID", "1234567890" },
197    { "1.2.3.4.5", "MyCustomAttribute" },
198    { NULL, NULL }
199};
200
201static const PKCS12_ATTR ATTRS2[] = {
202    { "friendlyName", "janet" },
203    { "localKeyID", "987654321" },
204    { "1.2.3.5.8.13", "AnotherCustomAttribute" },
205    { NULL, NULL }
206};
207
208static const PKCS12_ENC enc_default = {
209#ifndef OPENSSL_NO_DES
210    NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
211#else
212    NID_aes_128_cbc,
213#endif
214    "Password1",
215    1000
216};
217
218static const PKCS12_ENC mac_default = {
219    NID_sha1,
220    "Password1",
221    1000
222};
223
224static const int enc_nids_all[] = {
225    /* NOTE: To use PBES2 we pass the desired cipher NID instead of NID_pbes2 */
226    NID_aes_128_cbc,
227    NID_aes_256_cbc,
228#ifndef OPENSSL_NO_DES
229    NID_des_ede3_cbc,
230    NID_des_cbc,
231#endif
232#ifndef OPENSSL_NO_RC5
233    NID_rc5_cbc,
234#endif
235#ifndef OPENSSL_NO_RC4
236    NID_rc4,
237#endif
238#ifndef OPENSSL_NO_RC2
239    NID_rc2_cbc,
240#endif
241
242#ifndef OPENSSL_NO_MD2
243# ifndef OPENSSL_NO_DES
244    NID_pbeWithMD2AndDES_CBC,
245# endif
246# ifndef OPENSSL_NO_RC2
247    NID_pbeWithMD2AndRC2_CBC,
248# endif
249#endif
250
251#ifndef OPENSSL_NO_MD5
252# ifndef OPENSSL_NO_DES
253    NID_pbeWithMD5AndDES_CBC,
254# endif
255# ifndef OPENSSL_NO_RC2
256    NID_pbeWithMD5AndRC2_CBC,
257# endif
258#endif
259#ifndef OPENSSL_NO_DES
260    NID_pbeWithSHA1AndDES_CBC,
261#endif
262#ifndef OPENSSL_NO_RC2
263    NID_pbe_WithSHA1And128BitRC2_CBC,
264    NID_pbe_WithSHA1And40BitRC2_CBC,
265    NID_pbeWithSHA1AndRC2_CBC,
266#endif
267#ifndef OPENSSL_NO_RC4
268    NID_pbe_WithSHA1And128BitRC4,
269    NID_pbe_WithSHA1And40BitRC4,
270#endif
271#ifndef OPENSSL_NO_DES
272    NID_pbe_WithSHA1And2_Key_TripleDES_CBC,
273    NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
274#endif
275};
276
277static const int enc_nids_no_legacy[] = {
278    /* NOTE: To use PBES2 we pass the desired cipher NID instead of NID_pbes2 */
279    NID_aes_128_cbc,
280    NID_aes_256_cbc,
281#ifndef OPENSSL_NO_DES
282    NID_des_ede3_cbc,
283    NID_pbe_WithSHA1And2_Key_TripleDES_CBC,
284    NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
285#endif
286};
287
288static const int mac_nids[] = {
289    NID_sha1,
290    NID_md5,
291    NID_sha256,
292    NID_sha512,
293    NID_sha3_256,
294    NID_sha3_512
295};
296
297static const int iters[] = {
298    1,
299    1000
300};
301
302static const char *passwords[] = {
303    "Password1",
304    "",
305};
306
307/* --------------------------------------------------------------------------
308 * Local functions
309 */
310
311static int get_custom_oid(void)
312{
313    static int sec_nid = -1;
314
315    if (sec_nid != -1)
316        return sec_nid;
317    if (!TEST_true(OBJ_create("1.3.5.7.9", "CustomSecretOID", "My custom secret OID")))
318        return -1;
319    return sec_nid = OBJ_txt2nid("CustomSecretOID");
320}
321
322
323/* --------------------------------------------------------------------------
324 * PKCS12 format tests
325 */
326
327static int test_single_cert_no_attrs(void)
328{
329    PKCS12_BUILDER *pb = new_pkcs12_builder("1cert.p12");
330
331    /* Generate/encode */
332    start_pkcs12(pb);
333
334        start_contentinfo(pb);
335
336            add_certbag(pb, CERT1, sizeof(CERT1), NULL);
337
338        end_contentinfo(pb);
339
340    end_pkcs12(pb);
341
342    /* Read/decode */
343    start_check_pkcs12(pb);
344
345        start_check_contentinfo(pb);
346
347            check_certbag(pb, CERT1, sizeof(CERT1), NULL);
348
349        end_check_contentinfo(pb);
350
351    end_check_pkcs12(pb);
352
353    return end_pkcs12_builder(pb);
354}
355
356static int test_single_key(PKCS12_ENC *enc)
357{
358    char fname[80];
359    PKCS12_BUILDER *pb;
360
361    sprintf(fname, "1key_ciph-%s_iter-%d.p12", OBJ_nid2sn(enc->nid), enc->iter);
362
363    pb = new_pkcs12_builder(fname);
364
365    /* Generate/encode */
366    start_pkcs12(pb);
367
368        start_contentinfo(pb);
369
370            add_keybag(pb, KEY1, sizeof(KEY1), NULL, enc);
371
372        end_contentinfo(pb);
373
374    end_pkcs12(pb);
375
376    /* Read/decode */
377    start_check_pkcs12(pb);
378
379        start_check_contentinfo(pb);
380
381            check_keybag(pb, KEY1, sizeof(KEY1), NULL, enc);
382
383        end_check_contentinfo(pb);
384
385    end_check_pkcs12(pb);
386
387    return end_pkcs12_builder(pb);
388}
389
390static int test_single_key_enc_alg(int z)
391{
392    PKCS12_ENC enc;
393
394    if (lgcyprov == NULL)
395        enc.nid = enc_nids_no_legacy[z];
396    else
397        enc.nid = enc_nids_all[z];
398    enc.pass = enc_default.pass;
399    enc.iter = enc_default.iter;
400
401    return test_single_key(&enc);
402}
403
404static int test_single_key_enc_pass(int z)
405{
406    PKCS12_ENC enc;
407
408    enc.nid = enc_default.nid;
409    enc.pass = passwords[z];
410    enc.iter = enc_default.iter;
411
412    return test_single_key(&enc);
413}
414
415static int test_single_key_enc_iter(int z)
416{
417    PKCS12_ENC enc;
418
419    enc.nid = enc_default.nid;
420    enc.pass = enc_default.pass;
421    enc.iter = iters[z];
422
423    return test_single_key(&enc);
424}
425
426static int test_single_key_with_attrs(void)
427{
428    PKCS12_BUILDER *pb = new_pkcs12_builder("1keyattrs.p12");
429
430    /* Generate/encode */
431    start_pkcs12(pb);
432
433        start_contentinfo(pb);
434
435            add_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
436
437        end_contentinfo(pb);
438
439    end_pkcs12(pb);
440
441    /* Read/decode */
442    start_check_pkcs12(pb);
443
444        start_check_contentinfo(pb);
445
446            check_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
447
448        end_check_contentinfo(pb);
449
450    end_check_pkcs12(pb);
451
452    return end_pkcs12_builder(pb);
453}
454
455static int test_single_cert_mac(PKCS12_ENC *mac)
456{
457    char fname[80];
458    PKCS12_BUILDER *pb;
459
460    sprintf(fname, "1cert_mac-%s_iter-%d.p12", OBJ_nid2sn(mac->nid), mac->iter);
461
462    pb = new_pkcs12_builder(fname);
463
464    /* Generate/encode */
465    start_pkcs12(pb);
466
467        start_contentinfo(pb);
468
469            add_certbag(pb, CERT1, sizeof(CERT1), NULL);
470
471        end_contentinfo(pb);
472
473    end_pkcs12_with_mac(pb, mac);
474
475    /* Read/decode */
476    start_check_pkcs12_with_mac(pb, mac);
477
478        start_check_contentinfo(pb);
479
480            check_certbag(pb, CERT1, sizeof(CERT1), NULL);
481
482        end_check_contentinfo(pb);
483
484    end_check_pkcs12(pb);
485
486    return end_pkcs12_builder(pb);
487}
488
489static int test_single_cert_mac_alg(int z)
490{
491    PKCS12_ENC mac;
492
493    mac.nid = mac_nids[z];
494    mac.pass = mac_default.pass;
495    mac.iter = mac_default.iter;
496
497    return test_single_cert_mac(&mac);
498}
499
500static int test_single_cert_mac_pass(int z)
501{
502    PKCS12_ENC mac;
503
504    mac.nid = mac_default.nid;
505    mac.pass = passwords[z];
506    mac.iter = mac_default.iter;
507
508    return test_single_cert_mac(&mac);
509}
510
511static int test_single_cert_mac_iter(int z)
512{
513    PKCS12_ENC mac;
514
515    mac.nid = mac_default.nid;
516    mac.pass = mac_default.pass;
517    mac.iter = iters[z];
518
519    return test_single_cert_mac(&mac);
520}
521
522static int test_cert_key_with_attrs_and_mac(void)
523{
524    PKCS12_BUILDER *pb = new_pkcs12_builder("1cert1key.p12");
525
526    /* Generate/encode */
527    start_pkcs12(pb);
528
529        start_contentinfo(pb);
530
531            add_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
532            add_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
533
534        end_contentinfo(pb);
535
536    end_pkcs12_with_mac(pb, &mac_default);
537
538    /* Read/decode */
539    start_check_pkcs12_with_mac(pb, &mac_default);
540
541        start_check_contentinfo(pb);
542
543            check_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
544            check_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
545
546        end_check_contentinfo(pb);
547
548    end_check_pkcs12(pb);
549
550    return end_pkcs12_builder(pb);
551}
552
553static int test_cert_key_encrypted_content(void)
554{
555    PKCS12_BUILDER *pb = new_pkcs12_builder("1cert1key_enc.p12");
556
557    /* Generate/encode */
558    start_pkcs12(pb);
559
560        start_contentinfo(pb);
561
562            add_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
563            add_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
564
565        end_contentinfo_encrypted(pb, &enc_default);
566
567    end_pkcs12_with_mac(pb, &mac_default);
568
569    /* Read/decode */
570    start_check_pkcs12_with_mac(pb, &mac_default);
571
572        start_check_contentinfo_encrypted(pb, &enc_default);
573
574            check_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
575            check_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
576
577        end_check_contentinfo(pb);
578
579    end_check_pkcs12(pb);
580
581    return end_pkcs12_builder(pb);
582}
583
584static int test_single_secret_encrypted_content(void)
585{
586    PKCS12_BUILDER *pb = new_pkcs12_builder("1secret.p12");
587    int custom_nid = get_custom_oid();
588
589    /* Generate/encode */
590    start_pkcs12(pb);
591
592        start_contentinfo(pb);
593
594            add_secretbag(pb, custom_nid, "VerySecretMessage", ATTRS1);
595
596        end_contentinfo_encrypted(pb, &enc_default);
597
598    end_pkcs12_with_mac(pb, &mac_default);
599
600    /* Read/decode */
601    start_check_pkcs12_with_mac(pb, &mac_default);
602
603        start_check_contentinfo_encrypted(pb, &enc_default);
604
605            check_secretbag(pb, custom_nid, "VerySecretMessage", ATTRS1);
606
607        end_check_contentinfo(pb);
608
609    end_check_pkcs12(pb);
610
611    return end_pkcs12_builder(pb);
612}
613
614static int test_single_secret(PKCS12_ENC *enc)
615{
616    int custom_nid;
617    char fname[80];
618    PKCS12_BUILDER *pb;
619
620    sprintf(fname, "1secret_ciph-%s_iter-%d.p12", OBJ_nid2sn(enc->nid), enc->iter);
621    pb = new_pkcs12_builder(fname);
622    custom_nid = get_custom_oid();
623
624    /* Generate/encode */
625    start_pkcs12(pb);
626
627        start_contentinfo(pb);
628
629            add_secretbag(pb, custom_nid, "VerySecretMessage", ATTRS1);
630
631        end_contentinfo_encrypted(pb, enc);
632
633    end_pkcs12_with_mac(pb, &mac_default);
634
635    /* Read/decode */
636    start_check_pkcs12_with_mac(pb, &mac_default);
637
638        start_check_contentinfo_encrypted(pb, enc);
639
640            check_secretbag(pb, custom_nid, "VerySecretMessage", ATTRS1);
641
642        end_check_contentinfo(pb);
643
644    end_check_pkcs12(pb);
645
646    return end_pkcs12_builder(pb);
647}
648
649static int test_single_secret_enc_alg(int z)
650{
651    PKCS12_ENC enc;
652
653    if (lgcyprov == NULL)
654        enc.nid = enc_nids_no_legacy[z];
655    else
656        enc.nid = enc_nids_all[z];
657    enc.pass = enc_default.pass;
658    enc.iter = enc_default.iter;
659
660    return test_single_secret(&enc);
661}
662
663static int test_multiple_contents(void)
664{
665    PKCS12_BUILDER *pb = new_pkcs12_builder("multi_contents.p12");
666    int custom_nid = get_custom_oid();
667
668    /* Generate/encode */
669    start_pkcs12(pb);
670
671        start_contentinfo(pb);
672
673            add_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
674            add_certbag(pb, CERT2, sizeof(CERT2), ATTRS2);
675            add_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
676            add_keybag(pb, KEY2, sizeof(KEY2), ATTRS2, &enc_default);
677
678        end_contentinfo(pb);
679
680        start_contentinfo(pb);
681
682            add_secretbag(pb, custom_nid, "VeryVerySecretMessage", ATTRS1);
683
684        end_contentinfo_encrypted(pb, &enc_default);
685
686    end_pkcs12_with_mac(pb, &mac_default);
687
688    /* Read/decode */
689    start_check_pkcs12_with_mac(pb, &mac_default);
690
691        start_check_contentinfo(pb);
692
693            check_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
694            check_certbag(pb, CERT2, sizeof(CERT2), ATTRS2);
695            check_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
696            check_keybag(pb, KEY2, sizeof(KEY2), ATTRS2, &enc_default);
697
698        end_check_contentinfo(pb);
699
700        start_check_contentinfo_encrypted(pb, &enc_default);
701
702            check_secretbag(pb, custom_nid, "VeryVerySecretMessage", ATTRS1);
703
704        end_check_contentinfo(pb);
705
706    end_check_pkcs12(pb);
707
708    return end_pkcs12_builder(pb);
709}
710
711#ifndef OPENSSL_NO_DES
712static int pkcs12_create_test(void)
713{
714    int ret = 0;
715    EVP_PKEY *pkey = NULL;
716    PKCS12 *p12 = NULL;
717    const unsigned char *p;
718
719    static const unsigned char rsa_key[] = {
720        0x30, 0x82, 0x02, 0x5d, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xbb,
721        0x24, 0x7a, 0x09, 0x7e, 0x0e, 0xb2, 0x37, 0x32, 0xcc, 0x39, 0x67, 0xad,
722        0xf1, 0x9e, 0x3d, 0x6b, 0x82, 0x83, 0xd1, 0xd0, 0xac, 0xa4, 0xc0, 0x18,
723        0xbe, 0x8d, 0x98, 0x00, 0xc0, 0x7b, 0xff, 0x07, 0x44, 0xc9, 0xca, 0x1c,
724        0xba, 0x36, 0xe1, 0x27, 0x69, 0xff, 0xb1, 0xe3, 0x8d, 0x8b, 0xee, 0x57,
725        0xa9, 0x3a, 0xaa, 0x16, 0x43, 0x39, 0x54, 0x19, 0x7c, 0xae, 0x69, 0x24,
726        0x14, 0xf6, 0x64, 0xff, 0xbc, 0x74, 0xc6, 0x67, 0x6c, 0x4c, 0xf1, 0x02,
727        0x49, 0x69, 0xc7, 0x2b, 0xe1, 0xe1, 0xa1, 0xa3, 0x43, 0x14, 0xf4, 0x77,
728        0x8f, 0xc8, 0xd0, 0x85, 0x5a, 0x35, 0x95, 0xac, 0x62, 0xa9, 0xc1, 0x21,
729        0x00, 0x77, 0xa0, 0x8b, 0x97, 0x30, 0xb4, 0x5a, 0x2c, 0xb8, 0x90, 0x2f,
730        0x48, 0xa0, 0x05, 0x28, 0x4b, 0xf2, 0x0f, 0x8d, 0xec, 0x8b, 0x4d, 0x03,
731        0x42, 0x75, 0xd6, 0xad, 0x81, 0xc0, 0x11, 0x02, 0x03, 0x01, 0x00, 0x01,
732        0x02, 0x81, 0x80, 0x00, 0xfc, 0xb9, 0x4a, 0x26, 0x07, 0x89, 0x51, 0x2b,
733        0x53, 0x72, 0x91, 0xe0, 0x18, 0x3e, 0xa6, 0x5e, 0x31, 0xef, 0x9c, 0x0c,
734        0x16, 0x24, 0x42, 0xd0, 0x28, 0x33, 0xf9, 0xfa, 0xd0, 0x3c, 0x54, 0x04,
735        0x06, 0xc0, 0x15, 0xf5, 0x1b, 0x9a, 0xb3, 0x24, 0x31, 0xab, 0x3c, 0x6b,
736        0x47, 0x43, 0xb0, 0xd2, 0xa9, 0xdc, 0x05, 0xe1, 0x81, 0x59, 0xb6, 0x04,
737        0xe9, 0x66, 0x61, 0xaa, 0xd7, 0x0b, 0x00, 0x8f, 0x3d, 0xe5, 0xbf, 0xa2,
738        0xf8, 0x5e, 0x25, 0x6c, 0x1e, 0x22, 0x0f, 0xb4, 0xfd, 0x41, 0xe2, 0x03,
739        0x31, 0x5f, 0xda, 0x20, 0xc5, 0xc0, 0xf3, 0x55, 0x0e, 0xe1, 0xc9, 0xec,
740        0xd7, 0x3e, 0x2a, 0x0c, 0x01, 0xca, 0x7b, 0x22, 0xcb, 0xac, 0xf4, 0x2b,
741        0x27, 0xf0, 0x78, 0x5f, 0xb5, 0xc2, 0xf9, 0xe8, 0x14, 0x5a, 0x6e, 0x7e,
742        0x86, 0xbd, 0x6a, 0x9b, 0x20, 0x0c, 0xba, 0xcc, 0x97, 0x20, 0x11, 0x02,
743        0x41, 0x00, 0xc9, 0x59, 0x9f, 0x29, 0x8a, 0x5b, 0x9f, 0xe3, 0x2a, 0xd8,
744        0x7e, 0xc2, 0x40, 0x9f, 0xa8, 0x45, 0xe5, 0x3e, 0x11, 0x8d, 0x3c, 0xed,
745        0x6e, 0xab, 0xce, 0xd0, 0x65, 0x46, 0xd8, 0xc7, 0x07, 0x63, 0xb5, 0x23,
746        0x34, 0xf4, 0x9f, 0x7e, 0x1c, 0xc7, 0xc7, 0xf9, 0x65, 0xd1, 0xf4, 0x04,
747        0x42, 0x38, 0xbe, 0x3a, 0x0c, 0x9d, 0x08, 0x25, 0xfc, 0xa3, 0x71, 0xd9,
748        0xae, 0x0c, 0x39, 0x61, 0xf4, 0x89, 0x02, 0x41, 0x00, 0xed, 0xef, 0xab,
749        0xa9, 0xd5, 0x39, 0x9c, 0xee, 0x59, 0x1b, 0xff, 0xcf, 0x48, 0x44, 0x1b,
750        0xb6, 0x32, 0xe7, 0x46, 0x24, 0xf3, 0x04, 0x7f, 0xde, 0x95, 0x08, 0x6d,
751        0x75, 0x9e, 0x67, 0x17, 0xba, 0x5c, 0xa4, 0xd4, 0xe2, 0xe2, 0x4d, 0x77,
752        0xce, 0xeb, 0x66, 0x29, 0xc5, 0x96, 0xe0, 0x62, 0xbb, 0xe5, 0xac, 0xdc,
753        0x44, 0x62, 0x54, 0x86, 0xed, 0x64, 0x0c, 0xce, 0xd0, 0x60, 0x03, 0x9d,
754        0x49, 0x02, 0x40, 0x54, 0xd9, 0x18, 0x72, 0x27, 0xe4, 0xbe, 0x76, 0xbb,
755        0x1a, 0x6a, 0x28, 0x2f, 0x95, 0x58, 0x12, 0xc4, 0x2c, 0xa8, 0xb6, 0xcc,
756        0xe2, 0xfd, 0x0d, 0x17, 0x64, 0xc8, 0x18, 0xd7, 0xc6, 0xdf, 0x3d, 0x4c,
757        0x1a, 0x9e, 0xf9, 0x2a, 0xb0, 0xb9, 0x2e, 0x12, 0xfd, 0xec, 0xc3, 0x51,
758        0xc1, 0xed, 0xa9, 0xfd, 0xb7, 0x76, 0x93, 0x41, 0xd8, 0xc8, 0x22, 0x94,
759        0x1a, 0x77, 0xf6, 0x9c, 0xc3, 0xc3, 0x89, 0x02, 0x41, 0x00, 0x8e, 0xf9,
760        0xa7, 0x08, 0xad, 0xb5, 0x2a, 0x04, 0xdb, 0x8d, 0x04, 0xa1, 0xb5, 0x06,
761        0x20, 0x34, 0xd2, 0xcf, 0xc0, 0x89, 0xb1, 0x72, 0x31, 0xb8, 0x39, 0x8b,
762        0xcf, 0xe2, 0x8e, 0xa5, 0xda, 0x4f, 0x45, 0x1e, 0x53, 0x42, 0x66, 0xc4,
763        0x30, 0x4b, 0x29, 0x8e, 0xc1, 0x69, 0x17, 0x29, 0x8c, 0x8a, 0xe6, 0x0f,
764        0x82, 0x68, 0xa1, 0x41, 0xb3, 0xb6, 0x70, 0x99, 0x75, 0xa9, 0x27, 0x18,
765        0xe4, 0xe9, 0x02, 0x41, 0x00, 0x89, 0xea, 0x6e, 0x6d, 0x70, 0xdf, 0x25,
766        0x5f, 0x18, 0x3f, 0x48, 0xda, 0x63, 0x10, 0x8b, 0xfe, 0xa8, 0x0c, 0x94,
767        0x0f, 0xde, 0x97, 0x56, 0x53, 0x89, 0x94, 0xe2, 0x1e, 0x2c, 0x74, 0x3c,
768        0x91, 0x81, 0x34, 0x0b, 0xa6, 0x40, 0xf8, 0xcb, 0x2a, 0x60, 0x8c, 0xe0,
769        0x02, 0xb7, 0x89, 0x93, 0xcf, 0x18, 0x9f, 0x49, 0x54, 0xfd, 0x7d, 0x3f,
770        0x9a, 0xef, 0xd4, 0xa4, 0x4f, 0xc1, 0x45, 0x99, 0x91,
771    };
772
773    p = rsa_key;
774    if (!TEST_ptr(pkey = d2i_PrivateKey_ex(EVP_PKEY_RSA, NULL, &p,
775                                           sizeof(rsa_key), NULL, NULL)))
776        goto err;
777    if (!TEST_int_eq(ERR_peek_error(), 0))
778        goto err;
779    p12 = PKCS12_create(NULL, NULL, pkey, NULL, NULL,
780                        NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
781                        NID_pbe_WithSHA1And3_Key_TripleDES_CBC, 2, 1, 0);
782    if (!TEST_ptr(p12))
783        goto err;
784
785    if (!TEST_int_eq(ERR_peek_error(), 0))
786        goto err;
787    ret = 1;
788err:
789    PKCS12_free(p12);
790    EVP_PKEY_free(pkey);
791    return ret;
792}
793#endif
794
795typedef enum OPTION_choice {
796    OPT_ERR = -1,
797    OPT_EOF = 0,
798    OPT_WRITE,
799    OPT_LEGACY,
800    OPT_CONTEXT,
801    OPT_TEST_ENUM
802} OPTION_CHOICE;
803
804const OPTIONS *test_get_options(void)
805{
806    static const OPTIONS options[] = {
807        OPT_TEST_OPTIONS_DEFAULT_USAGE,
808        { "write",   OPT_WRITE,   '-', "Write PKCS12 objects to file" },
809        { "legacy",  OPT_LEGACY,  '-', "Test the legacy APIs" },
810        { "context", OPT_CONTEXT, '-', "Explicitly use a non-default library context" },
811        { NULL }
812    };
813    return options;
814}
815
816int setup_tests(void)
817{
818    OPTION_CHOICE o;
819
820    while ((o = opt_next()) != OPT_EOF) {
821        switch (o) {
822        case OPT_WRITE:
823            PKCS12_helper_set_write_files(1);
824            break;
825        case OPT_LEGACY:
826            PKCS12_helper_set_legacy(1);
827            break;
828        case OPT_CONTEXT:
829            default_libctx = 0;
830            break;
831        case OPT_TEST_CASES:
832            break;
833        default:
834            return 0;
835        }
836    }
837
838    if (!default_libctx) {
839        testctx = OSSL_LIB_CTX_new();
840        if (!TEST_ptr(testctx))
841            return 0;
842        nullprov = OSSL_PROVIDER_load(NULL, "null");
843        if (!TEST_ptr(nullprov))
844            return 0;
845    }
846
847    deflprov = OSSL_PROVIDER_load(testctx, "default");
848    if (!TEST_ptr(deflprov))
849        return 0;
850    lgcyprov = OSSL_PROVIDER_load(testctx, "legacy");
851
852    PKCS12_helper_set_libctx(testctx);
853
854    /*
855     * Verify that the default and fips providers in the default libctx are not
856     * available if we are using a standalone context
857     */
858    if (!default_libctx) {
859        if (!TEST_false(OSSL_PROVIDER_available(NULL, "default"))
860                || !TEST_false(OSSL_PROVIDER_available(NULL, "fips")))
861            return 0;
862    }
863
864    ADD_TEST(test_single_cert_no_attrs);
865    if (lgcyprov == NULL) {
866        ADD_ALL_TESTS(test_single_key_enc_alg, OSSL_NELEM(enc_nids_no_legacy));
867        ADD_ALL_TESTS(test_single_secret_enc_alg, OSSL_NELEM(enc_nids_no_legacy));
868    } else {
869        ADD_ALL_TESTS(test_single_key_enc_alg, OSSL_NELEM(enc_nids_all));
870        ADD_ALL_TESTS(test_single_secret_enc_alg, OSSL_NELEM(enc_nids_all));
871    }
872#ifndef OPENSSL_NO_DES
873    if (default_libctx)
874        ADD_TEST(pkcs12_create_test);
875#endif
876    ADD_ALL_TESTS(test_single_key_enc_pass, OSSL_NELEM(passwords));
877    ADD_ALL_TESTS(test_single_key_enc_iter, OSSL_NELEM(iters));
878    ADD_TEST(test_single_key_with_attrs);
879    ADD_ALL_TESTS(test_single_cert_mac_alg, OSSL_NELEM(mac_nids));
880    ADD_ALL_TESTS(test_single_cert_mac_pass, OSSL_NELEM(passwords));
881    ADD_ALL_TESTS(test_single_cert_mac_iter, OSSL_NELEM(iters));
882    ADD_TEST(test_cert_key_with_attrs_and_mac);
883    ADD_TEST(test_cert_key_encrypted_content);
884    ADD_TEST(test_single_secret_encrypted_content);
885    ADD_TEST(test_multiple_contents);
886    return 1;
887}
888
889void cleanup_tests(void)
890{
891    OSSL_PROVIDER_unload(nullprov);
892    OSSL_PROVIDER_unload(deflprov);
893    OSSL_PROVIDER_unload(lgcyprov);
894    OSSL_LIB_CTX_free(testctx);
895}
896