]> git.ipfire.org Git - thirdparty/strongswan.git/blame - src/libcharon/plugins/tnccs_20/messages/pb_remediation_parameters_msg.c
Moved debug.[ch] to utils folder
[thirdparty/strongswan.git] / src / libcharon / plugins / tnccs_20 / messages / pb_remediation_parameters_msg.c
CommitLineData
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
22ENUM(pb_tnc_remed_param_type_names, PB_REMEDIATION_URI, PB_REMEDIATION_STRING,
23 "Remediation-URI",
24 "Remediation-String"
25);
26
27typedef 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 */
57struct 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
94METHOD(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
100METHOD(pb_tnc_msg_t, get_encoding, chunk_t,
101 private_pb_remediation_parameters_msg_t *this)
102{
103 return this->encoding;
104}
105
106METHOD(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
126METHOD(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
175METHOD(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
184METHOD(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
191METHOD(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
197METHOD(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 */
206pb_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 */
233pb_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}