unit-tests: Fix "using integer constants in boolean context" warning
[strongswan.git] / src / libtncif / tncif_identity.c
1 /*
2 * Copyright (C) 2013 Andreas Steffen
3 * HSR Hochschule fuer Technik Rapperswil
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * for more details.
14 */
15
16 #include "tncif_identity.h"
17
18 #include <bio/bio_writer.h>
19 #include <bio/bio_reader.h>
20 #include <pen/pen.h>
21 #include <utils/debug.h>
22
23 typedef struct private_tncif_identity_t private_tncif_identity_t;
24
25 /**
26 * TNC Identity List Attribute Format (TCG TNC IF-IMV 1.4 Draft)
27 *
28 * 1 2 3
29 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
30 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31 * | Identity Count |
32 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
33 * | RESERVED | Identity Type Vendor ID |
34 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
35 * | Identity Type |
36 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
37 * | Identity Value Length |
38 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
39 * | |
40 * ~ Identity Value ~
41 * | |
42 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
43 * | RESERVED | Subject Type Vendor ID |
44 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
45 * | Subject Type |
46 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
47 * | RESERVED | Authentication Method Vendor ID |
48 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
49 * | Authentication Method |
50 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51 */
52
53 /**
54 * Private data of a tncif_identity_t object.
55 *
56 */
57 struct private_tncif_identity_t {
58
59 /**
60 * Public tncif_identity_t interface.
61 */
62 tncif_identity_t public;
63
64 /**
65 * Identity Type
66 */
67 pen_type_t identity_type;
68
69 /**
70 * Identity Value
71 */
72 chunk_t identity_value;
73
74 /**
75 * Subject Type
76 */
77 pen_type_t subject_type;
78
79 /**
80 * Authentication Type
81 */
82 pen_type_t auth_type;
83 };
84
85 METHOD(tncif_identity_t, get_identity_type, pen_type_t,
86 private_tncif_identity_t *this)
87 {
88 return this->identity_type;
89 }
90
91 METHOD(tncif_identity_t, get_identity_value, chunk_t,
92 private_tncif_identity_t *this)
93 {
94 return this->identity_value;
95 }
96
97 METHOD(tncif_identity_t, get_subject_type, pen_type_t,
98 private_tncif_identity_t *this)
99 {
100 return this->subject_type;
101 }
102
103 METHOD(tncif_identity_t, get_auth_type, pen_type_t,
104 private_tncif_identity_t *this)
105 {
106 return this->auth_type;
107 }
108
109 METHOD(tncif_identity_t, build, void,
110 private_tncif_identity_t *this, bio_writer_t *writer)
111 {
112 writer->write_uint32(writer, this->identity_type.vendor_id);
113 writer->write_uint32(writer, this->identity_type.type);
114 writer->write_data32(writer, this->identity_value);
115 writer->write_uint32(writer, this->subject_type.vendor_id);
116 writer->write_uint32(writer, this->subject_type.type);
117 writer->write_uint32(writer, this->auth_type.vendor_id);
118 writer->write_uint32(writer, this->auth_type.type);
119 }
120
121 METHOD(tncif_identity_t, process, bool,
122 private_tncif_identity_t *this, bio_reader_t *reader)
123 {
124 uint8_t reserved;
125 uint32_t vendor_id, type;
126 chunk_t identity_value;
127
128 if (reader->remaining(reader) < TNCIF_IDENTITY_MIN_SIZE)
129 {
130 return FALSE;
131 }
132 reader->read_uint8 (reader, &reserved);
133 reader->read_uint24(reader, &vendor_id);
134 reader->read_uint32(reader, &type);
135 this->identity_type = pen_type_create(vendor_id, type);
136
137 if (!reader->read_data32(reader, &identity_value) ||
138 reader->remaining(reader) < 16)
139 {
140 return FALSE;
141 }
142 this->identity_value = chunk_clone(identity_value);
143
144 reader->read_uint8 (reader, &reserved);
145 reader->read_uint24(reader, &vendor_id);
146 reader->read_uint32(reader, &type);
147 this->subject_type = pen_type_create(vendor_id, type);
148
149 reader->read_uint8 (reader, &reserved);
150 reader->read_uint24(reader, &vendor_id);
151 reader->read_uint32(reader, &type);
152 this->auth_type = pen_type_create(vendor_id, type);
153
154 return TRUE;
155 }
156
157 METHOD(tncif_identity_t, destroy, void,
158 private_tncif_identity_t *this)
159 {
160 free(this->identity_value.ptr);
161 free(this);
162 }
163
164
165 /**
166 * See header
167 */
168 tncif_identity_t *tncif_identity_create_empty(void)
169 {
170 private_tncif_identity_t *this;
171
172 INIT(this,
173 .public = {
174 .get_identity_type = _get_identity_type,
175 .get_identity_value = _get_identity_value,
176 .get_subject_type = _get_subject_type,
177 .get_auth_type = _get_auth_type,
178 .build = _build,
179 .process = _process,
180 .destroy = _destroy,
181 },
182 );
183
184 return &this->public;
185 }
186
187 /**
188 * See header
189 */
190 tncif_identity_t *tncif_identity_create(pen_type_t identity_type,
191 chunk_t identity_value,
192 pen_type_t subject_type,
193 pen_type_t auth_type)
194 {
195 private_tncif_identity_t *this;
196
197 this = (private_tncif_identity_t*)tncif_identity_create_empty();
198 this->identity_type = identity_type;
199 this->identity_value = identity_value;
200 this->subject_type = subject_type;
201 this->auth_type = auth_type;
202
203 return &this->public;
204 }
205