GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libcrypto/asn1/x_attrib.c Lines: 13 21 61.9 %
Date: 2017-11-07 Branches: 4 12 33.3 %

Line Branch Exec Source
1
/* $OpenBSD: x_attrib.c,v 1.13 2015/02/14 14:56:45 jsing Exp $ */
2
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3
 * All rights reserved.
4
 *
5
 * This package is an SSL implementation written
6
 * by Eric Young (eay@cryptsoft.com).
7
 * The implementation was written so as to conform with Netscapes SSL.
8
 *
9
 * This library is free for commercial and non-commercial use as long as
10
 * the following conditions are aheared to.  The following conditions
11
 * apply to all code found in this distribution, be it the RC4, RSA,
12
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13
 * included with this distribution is covered by the same copyright terms
14
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15
 *
16
 * Copyright remains Eric Young's, and as such any Copyright notices in
17
 * the code are not to be removed.
18
 * If this package is used in a product, Eric Young should be given attribution
19
 * as the author of the parts of the library used.
20
 * This can be in the form of a textual message at program startup or
21
 * in documentation (online or textual) provided with the package.
22
 *
23
 * Redistribution and use in source and binary forms, with or without
24
 * modification, are permitted provided that the following conditions
25
 * are met:
26
 * 1. Redistributions of source code must retain the copyright
27
 *    notice, this list of conditions and the following disclaimer.
28
 * 2. Redistributions in binary form must reproduce the above copyright
29
 *    notice, this list of conditions and the following disclaimer in the
30
 *    documentation and/or other materials provided with the distribution.
31
 * 3. All advertising materials mentioning features or use of this software
32
 *    must display the following acknowledgement:
33
 *    "This product includes cryptographic software written by
34
 *     Eric Young (eay@cryptsoft.com)"
35
 *    The word 'cryptographic' can be left out if the rouines from the library
36
 *    being used are not cryptographic related :-).
37
 * 4. If you include any Windows specific code (or a derivative thereof) from
38
 *    the apps directory (application code) you must include an acknowledgement:
39
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40
 *
41
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51
 * SUCH DAMAGE.
52
 *
53
 * The licence and distribution terms for any publically available version or
54
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
55
 * copied and put under another distribution licence
56
 * [including the GNU Public Licence.]
57
 */
58
59
#include <stdio.h>
60
61
#include <openssl/asn1t.h>
62
#include <openssl/objects.h>
63
#include <openssl/x509.h>
64
65
/* X509_ATTRIBUTE: this has the following form:
66
 *
67
 * typedef struct x509_attributes_st
68
 *	{
69
 *	ASN1_OBJECT *object;
70
 *	int single;
71
 *	union	{
72
 *		char		*ptr;
73
 * 		STACK_OF(ASN1_TYPE) *set;
74
 * 		ASN1_TYPE	*single;
75
 *		} value;
76
 *	} X509_ATTRIBUTE;
77
 *
78
 * this needs some extra thought because the CHOICE type is
79
 * merged with the main structure and because the value can
80
 * be anything at all we *must* try the SET OF first because
81
 * the ASN1_ANY type will swallow anything including the whole
82
 * SET OF structure.
83
 */
84
85
static const ASN1_TEMPLATE X509_ATTRIBUTE_SET_ch_tt[] = {
86
	{
87
		.flags = ASN1_TFLG_SET_OF,
88
		.tag = 0,
89
		.offset = offsetof(X509_ATTRIBUTE, value.set),
90
		.field_name = "value.set",
91
		.item = &ASN1_ANY_it,
92
	},
93
	{
94
		.flags = 0,
95
		.tag = 0,
96
		.offset = offsetof(X509_ATTRIBUTE, value.single),
97
		.field_name = "value.single",
98
		.item = &ASN1_ANY_it,
99
	},
100
};
101
102
const ASN1_ITEM X509_ATTRIBUTE_SET_it = {
103
	.itype = ASN1_ITYPE_CHOICE,
104
	.utype = offsetof(X509_ATTRIBUTE, single),
105
	.templates = X509_ATTRIBUTE_SET_ch_tt,
106
	.tcount = sizeof(X509_ATTRIBUTE_SET_ch_tt) / sizeof(ASN1_TEMPLATE),
107
	.funcs = NULL,
108
	.size = sizeof(X509_ATTRIBUTE),
109
	.sname = "X509_ATTRIBUTE",
110
};
111
112
static const ASN1_TEMPLATE X509_ATTRIBUTE_seq_tt[] = {
113
	{
114
		.flags = 0,
115
		.tag = 0,
116
		.offset = offsetof(X509_ATTRIBUTE, object),
117
		.field_name = "object",
118
		.item = &ASN1_OBJECT_it,
119
	},
120
	/* CHOICE type merged with parent */
121
	{
122
		.flags = 0 | ASN1_TFLG_COMBINE,
123
		.tag = 0,
124
		.offset = 0,
125
		.field_name = NULL,
126
		.item = &X509_ATTRIBUTE_SET_it,
127
	},
128
};
129
130
const ASN1_ITEM X509_ATTRIBUTE_it = {
131
	.itype = ASN1_ITYPE_SEQUENCE,
132
	.utype = V_ASN1_SEQUENCE,
133
	.templates = X509_ATTRIBUTE_seq_tt,
134
	.tcount = sizeof(X509_ATTRIBUTE_seq_tt) / sizeof(ASN1_TEMPLATE),
135
	.funcs = NULL,
136
	.size = sizeof(X509_ATTRIBUTE),
137
	.sname = "X509_ATTRIBUTE",
138
};
139
140
141
X509_ATTRIBUTE *
142
d2i_X509_ATTRIBUTE(X509_ATTRIBUTE **a, const unsigned char **in, long len)
143
{
144
	return (X509_ATTRIBUTE *)ASN1_item_d2i((ASN1_VALUE **)a, in, len,
145
	    &X509_ATTRIBUTE_it);
146
}
147
148
int
149
i2d_X509_ATTRIBUTE(X509_ATTRIBUTE *a, unsigned char **out)
150
{
151
	return ASN1_item_i2d((ASN1_VALUE *)a, out, &X509_ATTRIBUTE_it);
152
}
153
154
X509_ATTRIBUTE *
155
X509_ATTRIBUTE_new(void)
156
{
157
140
	return (X509_ATTRIBUTE *)ASN1_item_new(&X509_ATTRIBUTE_it);
158
}
159
160
void
161
X509_ATTRIBUTE_free(X509_ATTRIBUTE *a)
162
{
163
12
	ASN1_item_free((ASN1_VALUE *)a, &X509_ATTRIBUTE_it);
164
6
}
165
166
X509_ATTRIBUTE *
167
X509_ATTRIBUTE_dup(X509_ATTRIBUTE *x)
168
{
169
12
	return ASN1_item_dup(&X509_ATTRIBUTE_it, x);
170
}
171
172
X509_ATTRIBUTE *
173
X509_ATTRIBUTE_create(int nid, int atrtype, void *value)
174
{
175
	X509_ATTRIBUTE *ret = NULL;
176
	ASN1_TYPE *val = NULL;
177
178
128
	if ((ret = X509_ATTRIBUTE_new()) == NULL)
179
		return (NULL);
180
64
	ret->object = OBJ_nid2obj(nid);
181
64
	ret->single = 0;
182
64
	if ((ret->value.set = sk_ASN1_TYPE_new_null()) == NULL)
183
		goto err;
184
64
	if ((val = ASN1_TYPE_new()) == NULL)
185
		goto err;
186
64
	if (!sk_ASN1_TYPE_push(ret->value.set, val))
187
		goto err;
188
189
64
	ASN1_TYPE_set(val, atrtype, value);
190
64
	return (ret);
191
192
err:
193
	if (ret != NULL)
194
		X509_ATTRIBUTE_free(ret);
195
	if (val != NULL)
196
		ASN1_TYPE_free(val);
197
	return (NULL);
198
64
}