]>
Commit | Line | Data |
---|---|---|
54eb669d AS |
1 | /* |
2 | * Copyright (C) 2010 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 "pb_remediation_parameters_msg.h" | |
17 | ||
7e432eff AS |
18 | #include <bio/bio_writer.h> |
19 | #include <bio/bio_reader.h> | |
f05b4272 | 20 | #include <utils/debug.h> |
54eb669d AS |
21 | |
22 | ENUM(pb_tnc_remed_param_type_names, PB_REMEDIATION_URI, PB_REMEDIATION_STRING, | |
23 | "Remediation-URI", | |
24 | "Remediation-String" | |
25 | ); | |
26 | ||
27 | typedef struct private_pb_remediation_parameters_msg_t private_pb_remediation_parameters_msg_t; | |
28 | ||
29 | /** | |
30 | * PB-Remediation-Parameters message (see section 4.8 of RFC 5793) | |
31 | * | |
32 | * 0 1 2 3 | |
33 | * 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 | |
34 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
35 | * | Reserved | Remediation Parameters Vendor ID | | |
36 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
37 | * | Remediation Parameters Type | | |
38 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
39 | * | Remediation Parameters (Variable Length) | | |
40 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
41 | * | |
42 | * 0 1 2 3 | |
43 | * 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 | |
44 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
45 | * | Remediation String Length | | |
46 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
47 | * | Remediation String (Variable Length) | | |
48 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
49 | * | Lang Code Len | Remediation String Lang Code (Variable Len) | | |
50 | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |
51 | */ | |
52 | ||
53 | /** | |
d0eb2233 | 54 | * Private data of a pb_remediation_parameters_msg_t object. |
54eb669d AS |
55 | * |
56 | */ | |
57 | struct private_pb_remediation_parameters_msg_t { | |
58 | /** | |
59 | * Public pb_remediation_parameters_msg_t interface. | |
60 | */ | |
61 | pb_remediation_parameters_msg_t public; | |
62 | ||
63 | /** | |
64 | * PB-TNC message type | |
65 | */ | |
66 | pb_tnc_msg_type_t type; | |
67 | ||
68 | /** | |
69 | * Remediation Parameters Vendor ID | |
70 | */ | |
71 | u_int32_t vendor_id; | |
72 | ||
73 | /** | |
74 | * Remediation Parameters Type | |
75 | */ | |
76 | u_int32_t parameters_type; | |
77 | ||
78 | /** | |
79 | * Remediation Parameters string | |
80 | */ | |
81 | chunk_t remediation_string; | |
82 | ||
83 | /** | |
84 | * Language code | |
85 | */ | |
86 | chunk_t language_code; | |
87 | ||
88 | /** | |
89 | * Encoded message | |
90 | */ | |
91 | chunk_t encoding; | |
92 | }; | |
93 | ||
94 | METHOD(pb_tnc_msg_t, get_type, pb_tnc_msg_type_t, | |
95 | private_pb_remediation_parameters_msg_t *this) | |
96 | { | |
97 | return this->type; | |
98 | } | |
99 | ||
100 | METHOD(pb_tnc_msg_t, get_encoding, chunk_t, | |
101 | private_pb_remediation_parameters_msg_t *this) | |
102 | { | |
103 | return this->encoding; | |
104 | } | |
105 | ||
106 | METHOD(pb_tnc_msg_t, build, void, | |
107 | private_pb_remediation_parameters_msg_t *this) | |
108 | { | |
7e432eff | 109 | bio_writer_t *writer; |
54eb669d | 110 | |
3a16bec8 AS |
111 | if (this->encoding.ptr) |
112 | { | |
113 | return; | |
114 | } | |
7e432eff | 115 | writer = bio_writer_create(64); |
54eb669d AS |
116 | writer->write_uint32(writer, this->vendor_id); |
117 | writer->write_uint32(writer, this->parameters_type); | |
118 | writer->write_data32(writer, this->remediation_string); | |
119 | writer->write_data8 (writer, this->language_code); | |
120 | ||
54eb669d AS |
121 | this->encoding = writer->get_buf(writer); |
122 | this->encoding = chunk_clone(this->encoding); | |
123 | writer->destroy(writer); | |
124 | } | |
125 | ||
126 | METHOD(pb_tnc_msg_t, process, status_t, | |
10a6019e | 127 | private_pb_remediation_parameters_msg_t *this, u_int32_t *offset) |
54eb669d | 128 | { |
7e432eff | 129 | bio_reader_t *reader; |
54eb669d AS |
130 | |
131 | /* process message */ | |
7e432eff | 132 | reader = bio_reader_create(this->encoding); |
54eb669d AS |
133 | reader->read_uint32(reader, &this->vendor_id); |
134 | reader->read_uint32(reader, &this->parameters_type); | |
135 | ||
136 | if (!reader->read_data32(reader, &this->remediation_string)) | |
137 | { | |
138 | DBG1(DBG_TNC, "could not parse remediation string"); | |
139 | reader->destroy(reader); | |
140 | *offset = 8; | |
141 | return FAILED; | |
142 | }; | |
143 | this->remediation_string = chunk_clone(this->remediation_string); | |
144 | ||
145 | if (this->remediation_string.len && | |
146 | this->remediation_string.ptr[this->remediation_string.len-1] == '\0') | |
147 | { | |
148 | DBG1(DBG_TNC, "remediation string must not be null terminated"); | |
149 | reader->destroy(reader); | |
150 | *offset = 11 + this->remediation_string.len; | |
151 | return FAILED; | |
152 | } | |
153 | ||
154 | if (!reader->read_data8(reader, &this->language_code)) | |
155 | { | |
156 | DBG1(DBG_TNC, "could not parse language code"); | |
157 | reader->destroy(reader); | |
158 | *offset = 12 + this->remediation_string.len; | |
159 | return FAILED; | |
160 | }; | |
161 | this->language_code = chunk_clone(this->language_code); | |
162 | reader->destroy(reader); | |
163 | ||
164 | if (this->language_code.len && | |
165 | this->language_code.ptr[this->language_code.len-1] == '\0') | |
166 | { | |
167 | DBG1(DBG_TNC, "language code must not be null terminated"); | |
168 | *offset = 12 + this->remediation_string.len + this->language_code.len; | |
169 | return FAILED; | |
170 | } | |
171 | ||
172 | return SUCCESS; | |
173 | } | |
174 | ||
175 | METHOD(pb_tnc_msg_t, destroy, void, | |
176 | private_pb_remediation_parameters_msg_t *this) | |
177 | { | |
178 | free(this->encoding.ptr); | |
179 | free(this->remediation_string.ptr); | |
180 | free(this->language_code.ptr); | |
181 | free(this); | |
182 | } | |
183 | ||
184 | METHOD(pb_remediation_parameters_msg_t, get_vendor_id, u_int32_t, | |
185 | private_pb_remediation_parameters_msg_t *this, u_int32_t *type) | |
186 | { | |
187 | *type = this->parameters_type; | |
188 | return this->vendor_id; | |
189 | } | |
190 | ||
191 | METHOD(pb_remediation_parameters_msg_t, get_remediation_string, chunk_t, | |
192 | private_pb_remediation_parameters_msg_t *this) | |
193 | { | |
194 | return this->remediation_string; | |
195 | } | |
196 | ||
197 | METHOD(pb_remediation_parameters_msg_t, get_language_code, chunk_t, | |
198 | private_pb_remediation_parameters_msg_t *this) | |
199 | { | |
200 | return this->language_code; | |
201 | } | |
202 | ||
203 | /** | |
204 | * See header | |
205 | */ | |
206 | pb_tnc_msg_t *pb_remediation_parameters_msg_create_from_data(chunk_t data) | |
207 | { | |
208 | private_pb_remediation_parameters_msg_t *this; | |
209 | ||
210 | INIT(this, | |
211 | .public = { | |
212 | .pb_interface = { | |
213 | .get_type = _get_type, | |
214 | .get_encoding = _get_encoding, | |
215 | .build = _build, | |
216 | .process = _process, | |
217 | .destroy = _destroy, | |
218 | }, | |
219 | .get_vendor_id = _get_vendor_id, | |
220 | .get_remediation_string = _get_remediation_string, | |
221 | .get_language_code = _get_language_code, | |
222 | }, | |
223 | .type = PB_MSG_REASON_STRING, | |
224 | .encoding = chunk_clone(data), | |
225 | ); | |
226 | ||
227 | return &this->public.pb_interface; | |
228 | } | |
229 | ||
230 | /** | |
231 | * See header | |
232 | */ | |
233 | pb_tnc_msg_t* pb_remediation_parameters_msg_create(u_int32_t vendor_id, | |
234 | u_int32_t type, | |
235 | chunk_t remediation_string, | |
236 | chunk_t language_code) | |
237 | { | |
238 | private_pb_remediation_parameters_msg_t *this; | |
239 | ||
240 | INIT(this, | |
241 | .public = { | |
242 | .pb_interface = { | |
243 | .get_type = _get_type, | |
244 | .get_encoding = _get_encoding, | |
245 | .build = _build, | |
246 | .process = _process, | |
247 | .destroy = _destroy, | |
248 | }, | |
249 | .get_vendor_id = _get_vendor_id, | |
250 | .get_remediation_string = _get_remediation_string, | |
251 | .get_language_code = _get_language_code, | |
252 | }, | |
253 | .type = PB_MSG_REASON_STRING, | |
254 | .vendor_id = vendor_id, | |
255 | .parameters_type = type, | |
256 | .remediation_string = chunk_clone(remediation_string), | |
257 | .language_code = chunk_clone(language_code), | |
258 | ); | |
259 | ||
260 | return &this->public.pb_interface; | |
261 | } |