Newer
Older
#include <string>
//#include <typeinfo>
#include "uppertester_pki_codec.hh"
#include "loggers.hh"
#include "uppertester_types.hh"
//#include "pki_codec.hh"
template <typename T_type> class OPTIONAL;
class TTCN_EncDec;
int uppertester_pki_codec::encode (const Record_Type& msg, OCTETSTRING& data)
{
loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode: ", (const Record_Type&)msg);
TTCN_EncDec::clear_error();
TTCN_Buffer encoding_buffer;
if (std::string(msg.get_descriptor()->name).compare("@LibItsPki_TypesAndValues.UtPkiInitialize") == 0) {
encoding_buffer.put_c(static_cast<const unsigned char>(uppertester_pki_codec::c_utPkiInitialize));
} else { // Error
data = OCTETSTRING(0, nullptr);
loggers::get_instance().warning("<<< uppertester_pki_codec::encode: Failed to encode UT message");
return -1;
}
encode_(msg, *msg.get_descriptor(), encoding_buffer);
data = OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data());
loggers::get_instance().log_msg("<<< uppertester_pki_codec::encode: data=", data);
return 0;
}
int uppertester_pki_codec::encode (const LibItsPki__TypesAndValues::UtPkiTrigger& msg, OCTETSTRING& data)
{
loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode: ", (const Record_Type&)msg);
TTCN_EncDec::clear_error();
TTCN_Buffer encoding_buffer;
//const Record_Type *type;
const LibItsPki__TypesAndValues::UtPkiTrigger &u = static_cast<const LibItsPki__TypesAndValues::UtPkiTrigger &>(msg);
if (u.ischosen(LibItsPki__TypesAndValues::UtPkiTrigger::ALT_triggerEnrolmentRequest)) {
encoding_buffer.put_c(static_cast<const unsigned char>(uppertester_pki_codec::c_utPkiTriggerEnrolmentRequest));
encoding_buffer.put_c(static_cast<const unsigned char>(u.triggerEnrolmentRequest().cannonicalId().lengthof())); // Length of the string
encoding_buffer.put_string(u.triggerEnrolmentRequest().cannonicalId());
encoding_buffer.put_os(u.triggerEnrolmentRequest().encAlgorithm()); // One byte
encoding_buffer.put_os(u.triggerEnrolmentRequest().privateKey()); // 32 bytes
encoding_buffer.put_os(u.triggerEnrolmentRequest().compressedPublickey()); //33 bytes
} else { // Error
data = OCTETSTRING(0, nullptr);
loggers::get_instance().warning("<<< uppertester_pki_codec::encode: Failed to encode UT message");
return -1;
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
//encode_(*type, *type->get_descriptor(), encoding_buffer);
data = OCTETSTRING(encoding_buffer.get_len(), encoding_buffer.get_data());
loggers::get_instance().log_msg("<<< uppertester_pki_codec::encode: data=", data);
return 0;
}
int uppertester_pki_codec::encode_ (const Base_Type& type, const TTCN_Typedescriptor_t& field_descriptor, TTCN_Buffer& encoding_buffer)
{
loggers::get_instance().log(">>> uppertester_pki_codec::encode_: processing %s/%s/%p", type.get_descriptor()->name, field_descriptor.name, dynamic_cast<const Record_Type*>(&type));
loggers::get_instance().log_msg(">>> uppertester_pki_codec::encode_: ", type);
if (dynamic_cast<const Record_Type*>(&type) != NULL) {
const Record_Type& r = (const Record_Type &)type;
loggers::get_instance().log("uppertester_pki_codec::encode_: processing Record_Type %s", r.get_descriptor()->name);
for(int i = 0; i < r.get_count(); i++) {
loggers::get_instance().log("uppertester_pki_codec::encode_: processing %s/%s/%s - %d (1 ==> use dynamic_cast<const OPTIONAL<...>) - %d", r.fld_name(i), r.fld_descr(i)->name, r.get_at(i)->get_descriptor()->name, r.get_at(i)->is_optional(), r.get_at(i)->is_present());
if (r.get_at(i)->is_present()) {
if (encode_(*r.get_at(i), *r.fld_descr(i), encoding_buffer) == -1) {
loggers::get_instance().warning("uppertester_pki_codec::encode_: -1 result code returned");
return -1;
}
} else if (std::string(r.fld_name(i)).compare("alacarte") == 0) {
// Add empty field length
loggers::get_instance().log("uppertester_pki_codec::encode_: alacarte is missing, add 0x00");
encoding_buffer.put_c(0x00);
}
} // End of 'for' statement
} else {
std::string s(field_descriptor.name);
loggers::get_instance().log("uppertester_pki_codec::encode_: field to process %s", s.c_str());
/*if (
(s.rfind(".shape") != string::npos) ||
(s.rfind(".relevanceDistance") != string::npos) ||
(s.rfind(".relevanceTrafficDirection") != string::npos)
) {
encoding_buffer.put_c((unsigned char)static_cast<const Enum_Type&>(type).as_int());
} else if (s.rfind(".payload") != string::npos) {
const OCTETSTRING& os = static_cast<const OCTETSTRING&>(type);
const unsigned char s[] = { (unsigned char)((os.lengthof() & 0x0000FF00) >> 8), (unsigned char)os.lengthof() };
encoding_buffer.put_s(2, s);
if (os.lengthof() != 0) {
encoding_buffer.put_string(os);
}
} else if (s.rfind(".detectionTime") != string::npos) {
unsigned long long llu = static_cast<const INTEGER&>(type).get_long_long_val();
loggers::get_instance().log("uppertester_pki_codec::encode_ : detectionTime=%llu", llu);
std::vector<unsigned char> v;
for (int i = 0; i < 6; i++) {
v.insert(v.begin(), static_cast<unsigned char>(llu));
llu >>= 8;
} // End of 'for' statement
OCTETSTRING os(v.size(), v.data());
loggers::get_instance().log_msg("uppertester_pki_codec::encode_: timeDetection=", os);
encoding_buffer.put_string(os);
} else if (
(s.rfind(".validityDuration") != string::npos) ||
(s.rfind(".repetitionDuration") != string::npos)
) {
if (type.is_present()) {
const OPTIONAL<INTEGER> &o = dynamic_cast<const OPTIONAL<INTEGER> &>(type);
const INTEGER& i = static_cast<const INTEGER&>(*o.get_opt_value());
loggers::get_instance().log_msg("uppertester_pki_codec::encode_: i=", i);
encoding_buffer.put_string(int2oct(i, 3));
}
} else if (
(s.rfind(".informationQuality") != string::npos) ||
(s.rfind(".causeCode") != string::npos) ||
(s.rfind(".subCauseCode") != string::npos)
) {
const INTEGER& i = static_cast<const INTEGER&>(type);
encoding_buffer.put_string(int2oct(i, 1));
} else if (
(s.rfind(".linkedCause") != string::npos) ||
(s.rfind(".eventHistory") != string::npos)
) {
// Skip them
} else if (
(s.rfind(".transmissionInterval") != string::npos) ||
(s.rfind(".repetitionInterval") != string::npos)
) {
if (type.is_present()) {
const OPTIONAL<INTEGER> &o = dynamic_cast<const OPTIONAL<INTEGER> &>(type);
const INTEGER& i = static_cast<const INTEGER&>(*o.get_opt_value());
encoding_buffer.put_string(int2oct(i, 2));
}
} else if (s.rfind(".originatingStationID") != string::npos) {
const INTEGER& i = static_cast<const INTEGER&>(type);
encoding_buffer.put_string(int2oct(i, 4));
} else if (s.rfind(".sequenceNumber") != string::npos) {
const INTEGER& i = static_cast<const INTEGER&>(type);
encoding_buffer.put_string(int2oct(i, 2));
} else if (s.rfind(".AlacarteContainer") != string::npos) {
const OPTIONAL<OCTETSTRING> &o = dynamic_cast<const OPTIONAL<OCTETSTRING> &>(type);
const OCTETSTRING& os = static_cast<const OCTETSTRING&>(*o.get_opt_value());
encoding_buffer.put_string(int2oct(os.lengthof(), 2));
encoding_buffer.put_string(os);
} else {
loggers::get_instance().log("uppertester_pki_codec::encode_ (else): processing type %s/%s", type.get_descriptor()->name, field_descriptor.name);
type.encode(field_descriptor, encoding_buffer, TTCN_EncDec::CT_RAW);
}*/
}
loggers::get_instance().log_to_hexa("<<<uppertester_pki_codec::encode_: encoding_buffer=", encoding_buffer);
return 0;
}
int uppertester_pki_codec::decode (const OCTETSTRING& data, Record_Type& msg, params* params)
{
TTCN_EncDec::clear_error();
TTCN_Buffer decoding_buffer(data);
_params = params;
loggers::get_instance().log_to_hexa(">>> uppertester_pki_codec::decode: decoding_buffer=", decoding_buffer);
//decode_(msg, *msg.get_descriptor(), decoding_buffer);
loggers::get_instance().log_msg("<<< uppertester_pki_codec::decode: ", (const Record_Type&)msg);
return 0;
}
std::unique_ptr<Base_Type> uppertester_pki_codec::decode (const OCTETSTRING& data, params* params) {
std::unique_ptr<Base_Type> result;
/*const unsigned char* ptr = static_cast<const unsigned char*>(data);
if (*ptr != uppertester_pki_codec::c_utPkiEventInd) {
LibItsPki__TypesAndValues::UtPkiResults res;
if (decode(data, res, params) == 0) {
result.reset((Base_Type *)res.clone());
} else {
result.reset(nullptr);
}
return result;
}
int uppertester_pki_codec::decode (const OCTETSTRING& data, LibItsPki__TypesAndValues::UtPkiResults& msg, params* params)
{
loggers::get_instance().log_to_hexa(">>> uppertester_pki_codec::decode: decoding_buffer=", data);
const unsigned char* ptr = static_cast<const unsigned char*>(data);
if (*ptr == uppertester_pki_codec::c_utPkiInitializeResult) {
msg.utPkiInitializeResult() = BOOLEAN(*(ptr + 1) == 0x01);
} else if (*ptr == uppertester_pki_codec::c_utPkiTriggerResult) {
msg.utPkiTriggerResult() = BOOLEAN(*(ptr + 1) == 0x01);
} else {
loggers::get_instance().warning("uppertester_pki_codec::decode: Unsupported result");
return -1;
}
loggers::get_instance().log_msg("<<< uppertester_pki_codec::decode", msg);
return 0;
}