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