Fix grammar in certificates.txt
[openssl.git] / test / pkcs12_format_test.c
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
24 static int default_libctx = 1;
25
26 static OSSL_LIB_CTX *testctx = NULL;
27 static OSSL_PROVIDER *nullprov = NULL;
28 static OSSL_PROVIDER *deflprov = NULL;
29 static OSSL_PROVIDER *lgcyprov = NULL;
30
31 /* --------------------------------------------------------------------------
32  * PKCS12 component test data
33  */
34
35 static 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
71 static 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
107 static 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
151 static 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
194 static const PKCS12_ATTR ATTRS1[] = {
195     { "friendlyName", "george" },
196     { "localKeyID", "1234567890" },
197     { "1.2.3.4.5", "MyCustomAttribute" },
198     { NULL, NULL }
199 };
200
201 static const PKCS12_ATTR ATTRS2[] = {
202     { "friendlyName", "janet" },
203     { "localKeyID", "987654321" },
204     { "1.2.3.5.8.13", "AnotherCustomAttribute" },
205     { NULL, NULL }
206 };
207
208 static const PKCS12_ATTR ATTRS3[] = {
209     { "friendlyName", "wildduk" },
210     { "localKeyID", "1122334455" },
211     { "oracle-jdk-trustedkeyusage", "anyExtendedKeyUsage" },
212     { NULL, NULL }
213 };
214
215 static const PKCS12_ATTR ATTRS4[] = {
216     { "friendlyName", "wildduk" },
217     { "localKeyID", "1122334455" },
218     { NULL, NULL }
219 };
220
221 static const PKCS12_ENC enc_default = {
222 #ifndef OPENSSL_NO_DES
223     NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
224 #else
225     NID_aes_128_cbc,
226 #endif
227     "Password1",
228     1000
229 };
230
231 static const PKCS12_ENC mac_default = {
232     NID_sha1,
233     "Password1",
234     1000
235 };
236
237 static const int enc_nids_all[] = {
238     /* NOTE: To use PBES2 we pass the desired cipher NID instead of NID_pbes2 */
239     NID_aes_128_cbc,
240     NID_aes_256_cbc,
241 #ifndef OPENSSL_NO_DES
242     NID_des_ede3_cbc,
243     NID_des_cbc,
244 #endif
245 #ifndef OPENSSL_NO_RC5
246     NID_rc5_cbc,
247 #endif
248 #ifndef OPENSSL_NO_RC4
249     NID_rc4,
250 #endif
251 #ifndef OPENSSL_NO_RC2
252     NID_rc2_cbc,
253 #endif
254
255 #ifndef OPENSSL_NO_MD2
256 # ifndef OPENSSL_NO_DES
257     NID_pbeWithMD2AndDES_CBC,
258 # endif
259 # ifndef OPENSSL_NO_RC2
260     NID_pbeWithMD2AndRC2_CBC,
261 # endif
262 #endif
263
264 #ifndef OPENSSL_NO_MD5
265 # ifndef OPENSSL_NO_DES
266     NID_pbeWithMD5AndDES_CBC,
267 # endif
268 # ifndef OPENSSL_NO_RC2
269     NID_pbeWithMD5AndRC2_CBC,
270 # endif
271 #endif
272 #ifndef OPENSSL_NO_DES
273     NID_pbeWithSHA1AndDES_CBC,
274 #endif
275 #ifndef OPENSSL_NO_RC2
276     NID_pbe_WithSHA1And128BitRC2_CBC,
277     NID_pbe_WithSHA1And40BitRC2_CBC,
278     NID_pbeWithSHA1AndRC2_CBC,
279 #endif
280 #ifndef OPENSSL_NO_RC4
281     NID_pbe_WithSHA1And128BitRC4,
282     NID_pbe_WithSHA1And40BitRC4,
283 #endif
284 #ifndef OPENSSL_NO_DES
285     NID_pbe_WithSHA1And2_Key_TripleDES_CBC,
286     NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
287 #endif
288 };
289
290 static const int enc_nids_no_legacy[] = {
291     /* NOTE: To use PBES2 we pass the desired cipher NID instead of NID_pbes2 */
292     NID_aes_128_cbc,
293     NID_aes_256_cbc,
294 #ifndef OPENSSL_NO_DES
295     NID_des_ede3_cbc,
296     NID_pbe_WithSHA1And2_Key_TripleDES_CBC,
297     NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
298 #endif
299 };
300
301 static const int mac_nids[] = {
302     NID_sha1,
303     NID_md5,
304     NID_sha256,
305     NID_sha512,
306     NID_sha3_256,
307     NID_sha3_512
308 };
309
310 static const int iters[] = {
311     1,
312     1000
313 };
314
315 static const char *passwords[] = {
316     "Password1",
317     "",
318 };
319
320 /* --------------------------------------------------------------------------
321  * Local functions
322  */ 
323
324 static int get_custom_oid(void)
325 {
326     static int sec_nid = -1;
327
328     if (sec_nid != -1)
329         return sec_nid;
330     if (!TEST_true(OBJ_create("1.3.5.7.9", "CustomSecretOID", "My custom secret OID")))
331         return -1;
332     return sec_nid = OBJ_txt2nid("CustomSecretOID");
333 }
334
335
336 /* --------------------------------------------------------------------------
337  * PKCS12 format tests
338  */
339
340 static int test_single_cert_no_attrs(void)
341 {
342     PKCS12_BUILDER *pb = new_pkcs12_builder("1cert.p12");
343
344     /* Generate/encode */
345     start_pkcs12(pb);
346
347         start_contentinfo(pb);
348
349             add_certbag(pb, CERT1, sizeof(CERT1), NULL);
350
351         end_contentinfo(pb);
352
353     end_pkcs12(pb);
354
355     /* Read/decode */
356     start_check_pkcs12(pb);
357
358         start_check_contentinfo(pb);
359
360             check_certbag(pb, CERT1, sizeof(CERT1), NULL);
361
362         end_check_contentinfo(pb);
363
364     end_check_pkcs12(pb);
365
366     return end_pkcs12_builder(pb);
367 }
368
369 static int test_single_key(PKCS12_ENC *enc)
370 {
371     char fname[80];
372     PKCS12_BUILDER *pb;
373
374     sprintf(fname, "1key_ciph-%s_iter-%d.p12", OBJ_nid2sn(enc->nid), enc->iter);
375
376     pb = new_pkcs12_builder(fname);
377
378     /* Generate/encode */
379     start_pkcs12(pb);
380
381         start_contentinfo(pb);
382
383             add_keybag(pb, KEY1, sizeof(KEY1), NULL, enc);
384
385         end_contentinfo(pb);
386
387     end_pkcs12(pb);
388
389     /* Read/decode */
390     start_check_pkcs12(pb);
391
392         start_check_contentinfo(pb);
393
394             check_keybag(pb, KEY1, sizeof(KEY1), NULL, enc);
395
396         end_check_contentinfo(pb);
397
398     end_check_pkcs12(pb);
399
400     return end_pkcs12_builder(pb);
401 }
402
403 static int test_single_key_enc_alg(int z)
404 {
405     PKCS12_ENC enc;
406
407     if (lgcyprov == NULL)
408         enc.nid = enc_nids_no_legacy[z];
409     else
410         enc.nid = enc_nids_all[z];
411     enc.pass = enc_default.pass;
412     enc.iter = enc_default.iter;
413
414     return test_single_key(&enc);
415 }
416
417 static int test_single_key_enc_pass(int z)
418 {
419     PKCS12_ENC enc;
420
421     enc.nid = enc_default.nid;
422     enc.pass = passwords[z];
423     enc.iter = enc_default.iter;
424
425     return test_single_key(&enc);
426 }
427
428 static int test_single_key_enc_iter(int z)
429 {
430     PKCS12_ENC enc;
431
432     enc.nid = enc_default.nid;
433     enc.pass = enc_default.pass;
434     enc.iter = iters[z];
435
436     return test_single_key(&enc);
437 }
438
439 static int test_single_key_with_attrs(void)
440 {
441     PKCS12_BUILDER *pb = new_pkcs12_builder("1keyattrs.p12");
442
443     /* Generate/encode */
444     start_pkcs12(pb);
445
446         start_contentinfo(pb);
447
448             add_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
449
450         end_contentinfo(pb);
451
452     end_pkcs12(pb);
453
454     /* Read/decode */
455     start_check_pkcs12(pb);
456
457         start_check_contentinfo(pb);
458
459             check_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
460
461         end_check_contentinfo(pb);
462
463     end_check_pkcs12(pb);
464
465     return end_pkcs12_builder(pb);
466 }
467
468 static int test_single_cert_mac(PKCS12_ENC *mac)
469 {
470     char fname[80];
471     PKCS12_BUILDER *pb;
472
473     sprintf(fname, "1cert_mac-%s_iter-%d.p12", OBJ_nid2sn(mac->nid), mac->iter);
474
475     pb = new_pkcs12_builder(fname);
476
477     /* Generate/encode */
478     start_pkcs12(pb);
479
480         start_contentinfo(pb);
481
482             add_certbag(pb, CERT1, sizeof(CERT1), NULL);
483
484         end_contentinfo(pb);
485
486     end_pkcs12_with_mac(pb, mac);
487
488     /* Read/decode */
489     start_check_pkcs12_with_mac(pb, mac);
490
491         start_check_contentinfo(pb);
492
493             check_certbag(pb, CERT1, sizeof(CERT1), NULL);
494
495         end_check_contentinfo(pb);
496
497     end_check_pkcs12(pb);
498
499     return end_pkcs12_builder(pb);
500 }
501
502 static int test_single_cert_mac_alg(int z)
503 {
504     PKCS12_ENC mac;
505
506     mac.nid = mac_nids[z];
507     mac.pass = mac_default.pass;
508     mac.iter = mac_default.iter;
509
510     return test_single_cert_mac(&mac);
511 }
512
513 static int test_single_cert_mac_pass(int z)
514 {
515     PKCS12_ENC mac;
516
517     mac.nid = mac_default.nid;
518     mac.pass = passwords[z];
519     mac.iter = mac_default.iter;
520
521     return test_single_cert_mac(&mac);
522 }
523
524 static int test_single_cert_mac_iter(int z)
525 {
526     PKCS12_ENC mac;
527
528     mac.nid = mac_default.nid;
529     mac.pass = mac_default.pass;
530     mac.iter = iters[z];
531
532     return test_single_cert_mac(&mac);
533 }
534
535 static int test_cert_key_with_attrs_and_mac(void)
536 {
537     PKCS12_BUILDER *pb = new_pkcs12_builder("1cert1key.p12");
538
539     /* Generate/encode */
540     start_pkcs12(pb);
541
542         start_contentinfo(pb);
543
544             add_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
545             add_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
546
547         end_contentinfo(pb);
548
549     end_pkcs12_with_mac(pb, &mac_default);
550
551     /* Read/decode */
552     start_check_pkcs12_with_mac(pb, &mac_default);
553
554         start_check_contentinfo(pb);
555
556             check_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
557             check_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
558
559         end_check_contentinfo(pb);
560
561     end_check_pkcs12(pb);
562
563     return end_pkcs12_builder(pb);
564 }
565
566 static int test_cert_key_encrypted_content(void)
567 {
568     PKCS12_BUILDER *pb = new_pkcs12_builder("1cert1key_enc.p12");
569
570     /* Generate/encode */
571     start_pkcs12(pb);
572
573         start_contentinfo(pb);
574
575             add_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
576             add_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
577
578         end_contentinfo_encrypted(pb, &enc_default);
579
580     end_pkcs12_with_mac(pb, &mac_default);
581
582     /* Read/decode */
583     start_check_pkcs12_with_mac(pb, &mac_default);
584
585         start_check_contentinfo_encrypted(pb, &enc_default);
586
587             check_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
588             check_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
589
590         end_check_contentinfo(pb);
591
592     end_check_pkcs12(pb);
593
594     return end_pkcs12_builder(pb);
595 }
596
597 static int test_single_secret_encrypted_content(void)
598 {
599     PKCS12_BUILDER *pb = new_pkcs12_builder("1secret.p12");
600     int custom_nid = get_custom_oid();
601
602     /* Generate/encode */
603     start_pkcs12(pb);
604
605         start_contentinfo(pb);
606
607             add_secretbag(pb, custom_nid, "VerySecretMessage", ATTRS1);
608
609         end_contentinfo_encrypted(pb, &enc_default);
610
611     end_pkcs12_with_mac(pb, &mac_default);
612
613     /* Read/decode */
614     start_check_pkcs12_with_mac(pb, &mac_default);
615
616         start_check_contentinfo_encrypted(pb, &enc_default);
617
618             check_secretbag(pb, custom_nid, "VerySecretMessage", ATTRS1);
619
620         end_check_contentinfo(pb);
621
622     end_check_pkcs12(pb);
623
624     return end_pkcs12_builder(pb);
625 }
626
627 static int test_single_secret(PKCS12_ENC *enc)
628 {
629     int custom_nid;
630     char fname[80];
631     PKCS12_BUILDER *pb;
632
633     sprintf(fname, "1secret_ciph-%s_iter-%d.p12", OBJ_nid2sn(enc->nid), enc->iter);
634     pb = new_pkcs12_builder(fname);
635     custom_nid = get_custom_oid();
636
637     /* Generate/encode */
638     start_pkcs12(pb);
639
640         start_contentinfo(pb);
641
642             add_secretbag(pb, custom_nid, "VerySecretMessage", ATTRS1);
643
644         end_contentinfo_encrypted(pb, enc);
645
646     end_pkcs12_with_mac(pb, &mac_default);
647
648     /* Read/decode */
649     start_check_pkcs12_with_mac(pb, &mac_default);
650
651         start_check_contentinfo_encrypted(pb, enc);
652
653             check_secretbag(pb, custom_nid, "VerySecretMessage", ATTRS1);
654
655         end_check_contentinfo(pb);
656
657     end_check_pkcs12(pb);
658
659     return end_pkcs12_builder(pb);
660 }
661
662 static int test_single_secret_enc_alg(int z)
663 {
664     PKCS12_ENC enc;
665
666     if (lgcyprov == NULL)
667         enc.nid = enc_nids_no_legacy[z];
668     else
669         enc.nid = enc_nids_all[z];
670     enc.pass = enc_default.pass;
671     enc.iter = enc_default.iter;
672
673     return test_single_secret(&enc);
674 }
675
676 static int test_multiple_contents(void)
677 {
678     PKCS12_BUILDER *pb = new_pkcs12_builder("multi_contents.p12");
679     int custom_nid = get_custom_oid();
680
681     /* Generate/encode */
682     start_pkcs12(pb);
683
684         start_contentinfo(pb);
685
686             add_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
687             add_certbag(pb, CERT2, sizeof(CERT2), ATTRS2);
688             add_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
689             add_keybag(pb, KEY2, sizeof(KEY2), ATTRS2, &enc_default);
690
691         end_contentinfo(pb);
692
693         start_contentinfo(pb);
694
695             add_secretbag(pb, custom_nid, "VeryVerySecretMessage", ATTRS1);
696
697         end_contentinfo_encrypted(pb, &enc_default);
698
699     end_pkcs12_with_mac(pb, &mac_default);
700
701     /* Read/decode */
702     start_check_pkcs12_with_mac(pb, &mac_default);
703
704         start_check_contentinfo(pb);
705
706             check_certbag(pb, CERT1, sizeof(CERT1), ATTRS1);
707             check_certbag(pb, CERT2, sizeof(CERT2), ATTRS2);
708             check_keybag(pb, KEY1, sizeof(KEY1), ATTRS1, &enc_default);
709             check_keybag(pb, KEY2, sizeof(KEY2), ATTRS2, &enc_default);
710
711         end_check_contentinfo(pb);
712
713         start_check_contentinfo_encrypted(pb, &enc_default);
714
715             check_secretbag(pb, custom_nid, "VeryVerySecretMessage", ATTRS1);
716
717         end_check_contentinfo(pb);
718
719     end_check_pkcs12(pb);
720
721     return end_pkcs12_builder(pb);
722 }
723
724 static int test_jdk_trusted_attr(void)
725 {
726     PKCS12_BUILDER *pb = new_pkcs12_builder("jdk_trusted.p12");
727
728     /* Generate/encode */
729     start_pkcs12(pb);
730
731         start_contentinfo(pb);
732
733             add_certbag(pb, CERT1, sizeof(CERT1), ATTRS3);
734
735         end_contentinfo(pb);
736
737     end_pkcs12_with_mac(pb, &mac_default);
738
739     /* Read/decode */
740     start_check_pkcs12_with_mac(pb, &mac_default);
741
742         start_check_contentinfo(pb);
743
744             check_certbag(pb, CERT1, sizeof(CERT1), ATTRS3);
745
746         end_check_contentinfo(pb);
747
748     end_check_pkcs12(pb);
749
750     return end_pkcs12_builder(pb);
751 }
752
753 static int test_set0_attrs(void)
754 {
755     PKCS12_BUILDER *pb = new_pkcs12_builder("attrs.p12");
756     PKCS12_SAFEBAG *bag = NULL;
757     STACK_OF(X509_ATTRIBUTE) *attrs = NULL;
758     X509_ATTRIBUTE *attr = NULL;
759
760     start_pkcs12(pb);
761
762         start_contentinfo(pb);
763
764             /* Add cert and attrs (name/locakkey only) */
765             add_certbag(pb, CERT1, sizeof(CERT1), ATTRS4);
766
767             bag = sk_PKCS12_SAFEBAG_value(pb->bags, 0);
768             attrs = (STACK_OF(X509_ATTRIBUTE)*)PKCS12_SAFEBAG_get0_attrs(bag);
769
770             /* Create new attr, add to list and confirm return attrs is not NULL */
771             attr = X509_ATTRIBUTE_create(NID_oracle_jdk_trustedkeyusage, V_ASN1_OBJECT, OBJ_txt2obj("anyExtendedKeyUsage", 0));
772             X509at_add1_attr(&attrs, attr);
773             PKCS12_SAFEBAG_set0_attrs(bag, attrs);
774             attrs = (STACK_OF(X509_ATTRIBUTE)*)PKCS12_SAFEBAG_get0_attrs(bag);
775             X509_ATTRIBUTE_free(attr);
776             if(!TEST_ptr(attrs)) {
777                 goto err;
778             }
779
780         end_contentinfo(pb);
781
782     end_pkcs12(pb);
783
784     /* Read/decode */
785     start_check_pkcs12(pb);
786
787         start_check_contentinfo(pb);
788
789             /* Use existing check functionality to confirm cert bag attrs identical to ATTRS3 */
790             check_certbag(pb, CERT1, sizeof(CERT1), ATTRS3);
791
792         end_check_contentinfo(pb);
793
794     end_check_pkcs12(pb);
795
796     return end_pkcs12_builder(pb);
797
798 err:
799     (void)end_pkcs12_builder(pb);
800     return 0;
801 }
802
803 #ifndef OPENSSL_NO_DES
804 static int pkcs12_create_test(void)
805 {
806     int ret = 0;
807     EVP_PKEY *pkey = NULL;
808     PKCS12 *p12 = NULL;
809     const unsigned char *p;
810
811     static const unsigned char rsa_key[] = {
812         0x30, 0x82, 0x02, 0x5d, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, 0xbb,
813         0x24, 0x7a, 0x09, 0x7e, 0x0e, 0xb2, 0x37, 0x32, 0xcc, 0x39, 0x67, 0xad,
814         0xf1, 0x9e, 0x3d, 0x6b, 0x82, 0x83, 0xd1, 0xd0, 0xac, 0xa4, 0xc0, 0x18,
815         0xbe, 0x8d, 0x98, 0x00, 0xc0, 0x7b, 0xff, 0x07, 0x44, 0xc9, 0xca, 0x1c,
816         0xba, 0x36, 0xe1, 0x27, 0x69, 0xff, 0xb1, 0xe3, 0x8d, 0x8b, 0xee, 0x57,
817         0xa9, 0x3a, 0xaa, 0x16, 0x43, 0x39, 0x54, 0x19, 0x7c, 0xae, 0x69, 0x24,
818         0x14, 0xf6, 0x64, 0xff, 0xbc, 0x74, 0xc6, 0x67, 0x6c, 0x4c, 0xf1, 0x02,
819         0x49, 0x69, 0xc7, 0x2b, 0xe1, 0xe1, 0xa1, 0xa3, 0x43, 0x14, 0xf4, 0x77,
820         0x8f, 0xc8, 0xd0, 0x85, 0x5a, 0x35, 0x95, 0xac, 0x62, 0xa9, 0xc1, 0x21,
821         0x00, 0x77, 0xa0, 0x8b, 0x97, 0x30, 0xb4, 0x5a, 0x2c, 0xb8, 0x90, 0x2f,
822         0x48, 0xa0, 0x05, 0x28, 0x4b, 0xf2, 0x0f, 0x8d, 0xec, 0x8b, 0x4d, 0x03,
823         0x42, 0x75, 0xd6, 0xad, 0x81, 0xc0, 0x11, 0x02, 0x03, 0x01, 0x00, 0x01,
824         0x02, 0x81, 0x80, 0x00, 0xfc, 0xb9, 0x4a, 0x26, 0x07, 0x89, 0x51, 0x2b,
825         0x53, 0x72, 0x91, 0xe0, 0x18, 0x3e, 0xa6, 0x5e, 0x31, 0xef, 0x9c, 0x0c,
826         0x16, 0x24, 0x42, 0xd0, 0x28, 0x33, 0xf9, 0xfa, 0xd0, 0x3c, 0x54, 0x04,
827         0x06, 0xc0, 0x15, 0xf5, 0x1b, 0x9a, 0xb3, 0x24, 0x31, 0xab, 0x3c, 0x6b,
828         0x47, 0x43, 0xb0, 0xd2, 0xa9, 0xdc, 0x05, 0xe1, 0x81, 0x59, 0xb6, 0x04,
829         0xe9, 0x66, 0x61, 0xaa, 0xd7, 0x0b, 0x00, 0x8f, 0x3d, 0xe5, 0xbf, 0xa2,
830         0xf8, 0x5e, 0x25, 0x6c, 0x1e, 0x22, 0x0f, 0xb4, 0xfd, 0x41, 0xe2, 0x03,
831         0x31, 0x5f, 0xda, 0x20, 0xc5, 0xc0, 0xf3, 0x55, 0x0e, 0xe1, 0xc9, 0xec,
832         0xd7, 0x3e, 0x2a, 0x0c, 0x01, 0xca, 0x7b, 0x22, 0xcb, 0xac, 0xf4, 0x2b,
833         0x27, 0xf0, 0x78, 0x5f, 0xb5, 0xc2, 0xf9, 0xe8, 0x14, 0x5a, 0x6e, 0x7e,
834         0x86, 0xbd, 0x6a, 0x9b, 0x20, 0x0c, 0xba, 0xcc, 0x97, 0x20, 0x11, 0x02,
835         0x41, 0x00, 0xc9, 0x59, 0x9f, 0x29, 0x8a, 0x5b, 0x9f, 0xe3, 0x2a, 0xd8,
836         0x7e, 0xc2, 0x40, 0x9f, 0xa8, 0x45, 0xe5, 0x3e, 0x11, 0x8d, 0x3c, 0xed,
837         0x6e, 0xab, 0xce, 0xd0, 0x65, 0x46, 0xd8, 0xc7, 0x07, 0x63, 0xb5, 0x23,
838         0x34, 0xf4, 0x9f, 0x7e, 0x1c, 0xc7, 0xc7, 0xf9, 0x65, 0xd1, 0xf4, 0x04,
839         0x42, 0x38, 0xbe, 0x3a, 0x0c, 0x9d, 0x08, 0x25, 0xfc, 0xa3, 0x71, 0xd9,
840         0xae, 0x0c, 0x39, 0x61, 0xf4, 0x89, 0x02, 0x41, 0x00, 0xed, 0xef, 0xab,
841         0xa9, 0xd5, 0x39, 0x9c, 0xee, 0x59, 0x1b, 0xff, 0xcf, 0x48, 0x44, 0x1b,
842         0xb6, 0x32, 0xe7, 0x46, 0x24, 0xf3, 0x04, 0x7f, 0xde, 0x95, 0x08, 0x6d,
843         0x75, 0x9e, 0x67, 0x17, 0xba, 0x5c, 0xa4, 0xd4, 0xe2, 0xe2, 0x4d, 0x77,
844         0xce, 0xeb, 0x66, 0x29, 0xc5, 0x96, 0xe0, 0x62, 0xbb, 0xe5, 0xac, 0xdc,
845         0x44, 0x62, 0x54, 0x86, 0xed, 0x64, 0x0c, 0xce, 0xd0, 0x60, 0x03, 0x9d,
846         0x49, 0x02, 0x40, 0x54, 0xd9, 0x18, 0x72, 0x27, 0xe4, 0xbe, 0x76, 0xbb,
847         0x1a, 0x6a, 0x28, 0x2f, 0x95, 0x58, 0x12, 0xc4, 0x2c, 0xa8, 0xb6, 0xcc,
848         0xe2, 0xfd, 0x0d, 0x17, 0x64, 0xc8, 0x18, 0xd7, 0xc6, 0xdf, 0x3d, 0x4c,
849         0x1a, 0x9e, 0xf9, 0x2a, 0xb0, 0xb9, 0x2e, 0x12, 0xfd, 0xec, 0xc3, 0x51,
850         0xc1, 0xed, 0xa9, 0xfd, 0xb7, 0x76, 0x93, 0x41, 0xd8, 0xc8, 0x22, 0x94,
851         0x1a, 0x77, 0xf6, 0x9c, 0xc3, 0xc3, 0x89, 0x02, 0x41, 0x00, 0x8e, 0xf9,
852         0xa7, 0x08, 0xad, 0xb5, 0x2a, 0x04, 0xdb, 0x8d, 0x04, 0xa1, 0xb5, 0x06,
853         0x20, 0x34, 0xd2, 0xcf, 0xc0, 0x89, 0xb1, 0x72, 0x31, 0xb8, 0x39, 0x8b,
854         0xcf, 0xe2, 0x8e, 0xa5, 0xda, 0x4f, 0x45, 0x1e, 0x53, 0x42, 0x66, 0xc4,
855         0x30, 0x4b, 0x29, 0x8e, 0xc1, 0x69, 0x17, 0x29, 0x8c, 0x8a, 0xe6, 0x0f,
856         0x82, 0x68, 0xa1, 0x41, 0xb3, 0xb6, 0x70, 0x99, 0x75, 0xa9, 0x27, 0x18,
857         0xe4, 0xe9, 0x02, 0x41, 0x00, 0x89, 0xea, 0x6e, 0x6d, 0x70, 0xdf, 0x25,
858         0x5f, 0x18, 0x3f, 0x48, 0xda, 0x63, 0x10, 0x8b, 0xfe, 0xa8, 0x0c, 0x94,
859         0x0f, 0xde, 0x97, 0x56, 0x53, 0x89, 0x94, 0xe2, 0x1e, 0x2c, 0x74, 0x3c,
860         0x91, 0x81, 0x34, 0x0b, 0xa6, 0x40, 0xf8, 0xcb, 0x2a, 0x60, 0x8c, 0xe0,
861         0x02, 0xb7, 0x89, 0x93, 0xcf, 0x18, 0x9f, 0x49, 0x54, 0xfd, 0x7d, 0x3f,
862         0x9a, 0xef, 0xd4, 0xa4, 0x4f, 0xc1, 0x45, 0x99, 0x91,
863     };
864
865     p = rsa_key;
866     if (!TEST_ptr(pkey = d2i_PrivateKey_ex(EVP_PKEY_RSA, NULL, &p,
867                                            sizeof(rsa_key), NULL, NULL)))
868         goto err;
869     if (!TEST_int_eq(ERR_peek_error(), 0))
870         goto err;
871     p12 = PKCS12_create(NULL, NULL, pkey, NULL, NULL,
872                         NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
873                         NID_pbe_WithSHA1And3_Key_TripleDES_CBC, 2, 1, 0);
874     if (!TEST_ptr(p12))
875         goto err;
876
877     if (!TEST_int_eq(ERR_peek_error(), 0))
878         goto err;
879     ret = 1;
880 err:
881     PKCS12_free(p12);
882     EVP_PKEY_free(pkey);
883     return ret;
884 }
885 #endif
886
887 typedef enum OPTION_choice {
888     OPT_ERR = -1,
889     OPT_EOF = 0,
890     OPT_WRITE,
891     OPT_LEGACY,
892     OPT_CONTEXT,
893     OPT_TEST_ENUM
894 } OPTION_CHOICE;
895
896 const OPTIONS *test_get_options(void)
897 {
898     static const OPTIONS options[] = {
899         OPT_TEST_OPTIONS_DEFAULT_USAGE,
900         { "write",   OPT_WRITE,   '-', "Write PKCS12 objects to file" },
901         { "legacy",  OPT_LEGACY,  '-', "Test the legacy APIs" },
902         { "context", OPT_CONTEXT, '-', "Explicitly use a non-default library context" },
903         { NULL }
904     };
905     return options;
906 }
907
908 int setup_tests(void)
909 {
910     OPTION_CHOICE o;
911
912     while ((o = opt_next()) != OPT_EOF) {
913         switch (o) {
914         case OPT_WRITE:
915             PKCS12_helper_set_write_files(1);
916             break;
917         case OPT_LEGACY:
918             PKCS12_helper_set_legacy(1);
919             break;
920         case OPT_CONTEXT:
921             default_libctx = 0;
922             break;
923         case OPT_TEST_CASES:
924             break;
925         default:
926             return 0;
927         }
928     }
929
930     if (!default_libctx) {
931         testctx = OSSL_LIB_CTX_new();
932         if (!TEST_ptr(testctx))
933             return 0;
934         nullprov = OSSL_PROVIDER_load(NULL, "null");
935         if (!TEST_ptr(nullprov))
936             return 0;
937     }
938
939     deflprov = OSSL_PROVIDER_load(testctx, "default");
940     if (!TEST_ptr(deflprov))
941         return 0;
942     lgcyprov = OSSL_PROVIDER_load(testctx, "legacy");
943
944     PKCS12_helper_set_libctx(testctx);
945
946     /*
947      * Verify that the default and fips providers in the default libctx are not
948      * available if we are using a standalone context
949      */
950     if (!default_libctx) {
951         if (!TEST_false(OSSL_PROVIDER_available(NULL, "default"))
952                 || !TEST_false(OSSL_PROVIDER_available(NULL, "fips")))
953             return 0;
954     }
955
956     ADD_TEST(test_single_cert_no_attrs);
957     if (lgcyprov == NULL) {
958         ADD_ALL_TESTS(test_single_key_enc_alg, OSSL_NELEM(enc_nids_no_legacy));
959         ADD_ALL_TESTS(test_single_secret_enc_alg, OSSL_NELEM(enc_nids_no_legacy));
960     } else {
961         ADD_ALL_TESTS(test_single_key_enc_alg, OSSL_NELEM(enc_nids_all));
962         ADD_ALL_TESTS(test_single_secret_enc_alg, OSSL_NELEM(enc_nids_all));
963     }
964 #ifndef OPENSSL_NO_DES
965     if (default_libctx)
966         ADD_TEST(pkcs12_create_test);
967 #endif
968     ADD_ALL_TESTS(test_single_key_enc_pass, OSSL_NELEM(passwords));
969     ADD_ALL_TESTS(test_single_key_enc_iter, OSSL_NELEM(iters));
970     ADD_TEST(test_single_key_with_attrs);
971     ADD_ALL_TESTS(test_single_cert_mac_alg, OSSL_NELEM(mac_nids));
972     ADD_ALL_TESTS(test_single_cert_mac_pass, OSSL_NELEM(passwords));
973     ADD_ALL_TESTS(test_single_cert_mac_iter, OSSL_NELEM(iters));
974     ADD_TEST(test_cert_key_with_attrs_and_mac);
975     ADD_TEST(test_cert_key_encrypted_content);
976     ADD_TEST(test_single_secret_encrypted_content);
977     ADD_TEST(test_multiple_contents);
978     ADD_TEST(test_jdk_trusted_attr);
979     ADD_TEST(test_set0_attrs);
980     return 1;
981 }
982
983 void cleanup_tests(void)
984 {
985     OSSL_PROVIDER_unload(nullprov);
986     OSSL_PROVIDER_unload(deflprov);
987     OSSL_PROVIDER_unload(lgcyprov);
988     OSSL_LIB_CTX_free(testctx);
989 }