xref: /openbsd-src/regress/lib/libcrypto/x509/x509attribute.c (revision 2f6ec3fe0016809d247b0cb4bc897e8d0a5d9218)
1*2f6ec3feStb /* $OpenBSD: x509attribute.c,v 1.3 2021/11/01 08:28:31 tb Exp $ */
2d0d7c835Sschwarze /*
3d0d7c835Sschwarze  * Copyright (c) 2020 Ingo Schwarze <schwarze@openbsd.org>
4d0d7c835Sschwarze  *
5d0d7c835Sschwarze  * Permission to use, copy, modify, and distribute this software for any
6d0d7c835Sschwarze  * purpose with or without fee is hereby granted, provided that the above
7d0d7c835Sschwarze  * copyright notice and this permission notice appear in all copies.
8d0d7c835Sschwarze  *
9d0d7c835Sschwarze  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10d0d7c835Sschwarze  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11d0d7c835Sschwarze  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12d0d7c835Sschwarze  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13d0d7c835Sschwarze  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14d0d7c835Sschwarze  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15d0d7c835Sschwarze  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16d0d7c835Sschwarze  */
17d0d7c835Sschwarze 
18d0d7c835Sschwarze #include <errno.h>
19d0d7c835Sschwarze #include <stdio.h>
20d0d7c835Sschwarze #include <string.h>
21d0d7c835Sschwarze 
22d0d7c835Sschwarze #include <openssl/err.h>
23d0d7c835Sschwarze #include <openssl/x509.h>
24d0d7c835Sschwarze 
25d0d7c835Sschwarze void	 fail_head(const char *);
26d0d7c835Sschwarze void	 fail_tail(void);
27d0d7c835Sschwarze void	 fail_str(const char *, const char *);
28d0d7c835Sschwarze void	 fail_int(const char *, int);
29d0d7c835Sschwarze 
30d0d7c835Sschwarze static const char	*testname;
31d0d7c835Sschwarze static int		 errcount;
32d0d7c835Sschwarze 
33d0d7c835Sschwarze void
fail_head(const char * stepname)34d0d7c835Sschwarze fail_head(const char *stepname)
35d0d7c835Sschwarze {
36d0d7c835Sschwarze 	fprintf(stderr, "failure#%d testname=%s stepname=%s ",
37d0d7c835Sschwarze 	    ++errcount, testname, stepname);
38d0d7c835Sschwarze }
39d0d7c835Sschwarze 
40d0d7c835Sschwarze void
fail_tail(void)41d0d7c835Sschwarze fail_tail(void)
42d0d7c835Sschwarze {
43d0d7c835Sschwarze 	unsigned long	 errnum;
44d0d7c835Sschwarze 
45d0d7c835Sschwarze 	if ((errnum = ERR_get_error()))
46d0d7c835Sschwarze 		fprintf(stderr, "OpenSSL says: %s\n",
47d0d7c835Sschwarze 		    ERR_error_string(errnum, NULL));
48d0d7c835Sschwarze 	if (errno)
49d0d7c835Sschwarze 		fprintf(stderr, "libc says: %s\n", strerror(errno));
50d0d7c835Sschwarze }
51d0d7c835Sschwarze 
52d0d7c835Sschwarze void
fail_str(const char * stepname,const char * result)53d0d7c835Sschwarze fail_str(const char *stepname, const char *result)
54d0d7c835Sschwarze {
55d0d7c835Sschwarze 	fail_head(stepname);
56d0d7c835Sschwarze 	fprintf(stderr, "wrong result=%s\n", result);
57d0d7c835Sschwarze 	fail_tail();
58d0d7c835Sschwarze }
59d0d7c835Sschwarze 
60d0d7c835Sschwarze void
fail_int(const char * stepname,int result)61d0d7c835Sschwarze fail_int(const char *stepname, int result)
62d0d7c835Sschwarze {
63d0d7c835Sschwarze 	fail_head(stepname);
64d0d7c835Sschwarze 	fprintf(stderr, "wrong result=%d\n", result);
65d0d7c835Sschwarze 	fail_tail();
66d0d7c835Sschwarze }
67d0d7c835Sschwarze 
68d0d7c835Sschwarze int
main(void)69d0d7c835Sschwarze main(void)
70d0d7c835Sschwarze {
71d0d7c835Sschwarze 	X509_ATTRIBUTE	*attrib;
72d0d7c835Sschwarze 	ASN1_TYPE	*any;
73d0d7c835Sschwarze 	ASN1_OBJECT	*coid;
74d0d7c835Sschwarze 	int		 num;
75d0d7c835Sschwarze 
76d0d7c835Sschwarze 	testname = "preparation";
77d0d7c835Sschwarze 	if ((coid = OBJ_nid2obj(NID_pkcs7_data)) == NULL) {
78d0d7c835Sschwarze 		fail_str("OBJ_nid2obj", "NULL");
79d0d7c835Sschwarze 		return 1;
80d0d7c835Sschwarze 	}
81d0d7c835Sschwarze 
82d0d7c835Sschwarze 	testname = "valid_args";
83d0d7c835Sschwarze 	if ((attrib = X509_ATTRIBUTE_create(NID_pkcs9_contentType,
84d0d7c835Sschwarze 	    V_ASN1_OBJECT, coid)) == NULL)
85d0d7c835Sschwarze 		fail_str("X509_ATTRIBUTE_create", "NULL");
86*2f6ec3feStb 	else if (X509_ATTRIBUTE_get0_object(attrib) == NULL)
87*2f6ec3feStb 		fail_str("X509_ATTRIBUTE_get0_object", "NULL");
88*2f6ec3feStb 	else if ((num = X509_ATTRIBUTE_count(attrib)) != 1)
89*2f6ec3feStb 		fail_int("X509_ATTRIBUTE_count", num);
90*2f6ec3feStb 	else if ((any = X509_ATTRIBUTE_get0_type(attrib, 0)) == NULL)
91*2f6ec3feStb 		fail_str("X509_ATTRIBUTE_get0_type", "NULL");
92d0d7c835Sschwarze 	else if (any->type != V_ASN1_OBJECT)
93d0d7c835Sschwarze 		fail_int("any->type", any->type);
94d0d7c835Sschwarze 	else if (any->value.object != coid)
95d0d7c835Sschwarze 		fail_str("value", "wrong pointer");
96d0d7c835Sschwarze 	X509_ATTRIBUTE_free(attrib);
97d0d7c835Sschwarze 
98d0d7c835Sschwarze 	testname = "bad_nid";
99d0d7c835Sschwarze 	if ((attrib = X509_ATTRIBUTE_create(-1,
100d0d7c835Sschwarze 	    V_ASN1_OBJECT, coid)) != NULL)
101d0d7c835Sschwarze 		fail_str("X509_ATTRIBUTE_create", "not NULL");
102d0d7c835Sschwarze 	X509_ATTRIBUTE_free(attrib);
103d0d7c835Sschwarze 
104d0d7c835Sschwarze 	return errcount != 0;
105d0d7c835Sschwarze }
106