| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // Copyright (c) 2000-2016 Ericsson Telecom AB |
| // |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // which accompanies this distribution, and is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // File: TLS_EncDec.cc |
| // Description: Encode/decode functions for TLS messages |
| // Rev: R2B |
| // Prodnr: CNL 113 806 |
| // Updated: 2014-06-20 |
| // Contact: http://ttcn.ericsson.se |
| |
| #include "TLS_Types.hh" |
| #include "memory.h" |
| #include <string.h> |
| #include <stdio.h> |
| #include <iostream> |
| #include <exception> |
| |
| namespace TLS__Types{ |
| |
| struct TLS_Exception { |
| const char* what; |
| const char* file; |
| int line; |
| const char* func; |
| }; |
| |
| OCTETSTRING padd_os_to_len(const OCTETSTRING& os, const INTEGER& len) throw(TLS_Exception){ |
| if(len < os.lengthof()) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid CompressionMethod"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| return int2oct(0, len-os.lengthof()) + os ; |
| } |
| |
| ///////////////////////////////////// |
| //// Protocol Version EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ProtocolVersion(const TLS__Types::ProtocolVersion& version, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(version.major__(), 1)); |
| buf.put_os(int2oct(version.minor__(), 1)); |
| } |
| |
| ProtocolVersion dec__TLS__ProtocolVersion(const OCTETSTRING& stream) throw(TLS_Exception) { |
| ProtocolVersion ret; |
| |
| ret.major__() = oct2int(substr(stream, 0, 1)); |
| ret.minor__() = oct2int(substr(stream, 1, 1)); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Content Type EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ContentType(const TLS__Types::ContentType& ctype, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(ctype, 1)); |
| } |
| |
| ContentType dec__TLS__ContentType(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!ContentType::is_valid_enum(oct2int(stream))){ |
| TLS_Exception e; |
| e.what = (const char*)"Invalid ComponentType"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| |
| return (ContentType) oct2int(stream); |
| } |
| |
| ///////////////////////////////////// |
| //// Compression Method EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__CompressionMethod(const TLS__Types::CompressionMethod& method, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(method, 1)); |
| } |
| |
| CompressionMethod dec__TLS__CompressionMethod(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!CompressionMethod::is_valid_enum(oct2int(stream))){ |
| TLS_Exception e; |
| e.what = (const char*)"Invalid CompressionMethod"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| |
| return (CompressionMethod) oct2int(stream); |
| } |
| |
| ///////////////////////////////////// |
| //// Connection End EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ConnectionEnd(const TLS__Types::ConnectionEnd& ce, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(ce, 1)); |
| } |
| |
| ConnectionEnd dec__TLS__ConnectionEnd(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!ConnectionEnd::is_valid_enum(oct2int(stream))){ |
| TLS_Exception e; |
| e.what = (const char*)"Invalid ConnectionEnd"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| |
| return (ConnectionEnd) oct2int(stream);; |
| } |
| |
| ///////////////////////////////////// |
| //// Bulk Cipher Algorithm EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__BulkCipherAlgorithm(const TLS__Types::BulkCipherAlgorithm& bca, TTCN_Buffer& buf) throw(TLS_Exception){ |
| buf.put_os(int2oct(bca, 1)); |
| } |
| |
| BulkCipherAlgorithm dec__TLS__BulkCipherAlgorithm(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!BulkCipherAlgorithm::is_valid_enum(oct2int(stream))){ |
| TLS_Exception e; |
| e.what = (const char*)"Invalid BulkCipherAlgorithm"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| return (BulkCipherAlgorithm) oct2int(stream); |
| } |
| |
| ///////////////////////////////////// |
| //// Cipher Type EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__CipherType(const TLS__Types::CipherType& ct, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(ct, 1)); |
| } |
| |
| CipherType dec__TLS__CipherType(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!CipherType::is_valid_enum(oct2int(stream))){ |
| TLS_Exception e; |
| e.what = (const char*)"Invalid CipherType"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| |
| return (CipherType) oct2int(stream); |
| } |
| |
| ///////////////////////////////////// |
| //// MAC Algorithm EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__MACAlgorithm(const TLS__Types::MACAlgorithm& ct, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(ct, 1)); |
| } |
| |
| MACAlgorithm dec__TLS__MACAlgorithm(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!MACAlgorithm::is_valid_enum(oct2int(stream))){ |
| TLS_Exception e; |
| e.what = (const char*)"Invalid MACAlgorithm"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| |
| return (MACAlgorithm) oct2int(stream); |
| } |
| |
| ///////////////////////////////////// |
| //// Security Parameters EncDec |
| ///////////////////////////////////// |
| |
| OCTETSTRING enc__TLS__SecurityParameters(const TLS__Types::SecurityParameters& sp) { |
| TTCN_Buffer buf; |
| OCTETSTRING ret; |
| |
| enc__TLS__ConnectionEnd(sp.entity(), buf); |
| enc__TLS__BulkCipherAlgorithm(sp.bulk__cipher__algorithm(), buf); |
| enc__TLS__CipherType(sp.cipher__type(), buf); |
| buf.put_os(int2oct(sp.key__size(), 1)); |
| buf.put_os(int2oct(sp.key__material__length(), 1)); |
| enc__TLS__MACAlgorithm(sp.mac__algorithm(),buf); |
| buf.put_os(int2oct(sp.hash__size(), 1)); |
| enc__TLS__CompressionMethod(sp.compression__algorithm(), buf); |
| buf.put_os(sp.master__secret()); |
| buf.put_os(sp.client__random()); |
| buf.put_os(sp.server__random()); |
| |
| buf.get_string(ret); |
| |
| return ret; |
| } |
| |
| INTEGER dec__TLS__SecurityParameters(const OCTETSTRING& stream, TLS__Types::SecurityParameters& ret) { |
| if(stream.lengthof() < 120) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| try { |
| ret.entity() = dec__TLS__ConnectionEnd(substr(stream, 0, 1)); |
| ret.bulk__cipher__algorithm() = dec__TLS__BulkCipherAlgorithm(substr(stream, 1, 1)); |
| ret.cipher__type() = dec__TLS__CipherType(substr(stream, 2 , 1)); |
| ret.key__size() = oct2int(substr(stream, 3, 1)); |
| ret.key__material__length() = oct2int(substr(stream, 4, 1)); |
| ret.mac__algorithm() = dec__TLS__MACAlgorithm(substr(stream, 5, 1)); |
| ret.hash__size() = oct2int(substr(stream, 6, 1)); |
| ret.compression__algorithm() = dec__TLS__CompressionMethod(substr(stream, 7, 1)); |
| ret.master__secret() = substr(stream, 8, 48); |
| ret.client__random() = substr(stream, 56, 32); |
| ret.server__random() = substr(stream, 88, 32); |
| } catch (TLS_Exception e) { |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("***Error has occured: %s. In file: %s in function: %s at line: %d", e.what, e.file, e.func, e.line); |
| TTCN_Logger::end_event(); |
| return 0; |
| } |
| |
| return 1; |
| } |
| |
| ///////////////////////////////////// |
| //// Change Cipher Specs Enum EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ChangeCipherSpecEnum(const TLS__Types::ChangeCipherSpecEnum& ccse, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(ccse, 1)); |
| } |
| |
| ChangeCipherSpecEnum dec__TLS__ChangeCipherSpecEnum(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!ChangeCipherSpecEnum::is_valid_enum(oct2int(stream))){ |
| TLS_Exception e; |
| e.what = (const char*)"Invalid ChangeCipherSpecEnum"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| return (ChangeCipherSpecEnum) oct2int(stream);; |
| } |
| |
| ///////////////////////////////////// |
| //// Change Cipher Specs EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ChangeCipherSpec(const TLS__Types::ChangeCipherSpec& ccs, TTCN_Buffer& buf) { |
| enc__TLS__ChangeCipherSpecEnum(ccs.type__(), buf); |
| } |
| |
| ChangeCipherSpec dec__TLS__ChangeCipherSpec(const OCTETSTRING& stream){ |
| ChangeCipherSpec ret; |
| ret.type__() = dec__TLS__ChangeCipherSpecEnum(stream); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Alert Level EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__AlertLevel(const TLS__Types::AlertLevel& al, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(al, 1)); |
| } |
| |
| AlertLevel dec__TLS__AlertLevel(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!AlertLevel::is_valid_enum(oct2int(stream))){ |
| TLS_Exception e; |
| e.what = (const char*)"Invalid AlertLevel"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| return (AlertLevel) oct2int(stream); |
| } |
| |
| ///////////////////////////////////// |
| //// Alert Description EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__AlertDescription(const TLS__Types::AlertDescription& ald, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(ald, 1)); |
| } |
| |
| AlertDescription dec__TLS__AlertDescription(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!AlertDescription::is_valid_enum(oct2int(stream))){ |
| TLS_Exception e; |
| e.what = (const char*)"Invalid AlertDescription"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| |
| return (AlertDescription) oct2int(stream); |
| } |
| |
| ///////////////////////////////////// |
| //// Alert EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__Alert(const TLS__Types::Alert& alert, TTCN_Buffer& buf) { |
| enc__TLS__AlertLevel(alert.level(), buf); |
| enc__TLS__AlertDescription(alert.description(),buf); |
| } |
| |
| Alert dec__TLS__Alert(const OCTETSTRING& stream) { |
| Alert ret; |
| |
| ret.level() = dec__TLS__AlertLevel(substr(stream, 0, 1)); |
| ret.description() = dec__TLS__AlertDescription(substr(stream, 1, 1)); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Handshake Type EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__HandshakeType(const TLS__Types::HandshakeType& ht, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(ht, 1)); |
| } |
| |
| INTEGER dec__TLS__HandshakeType(const OCTETSTRING& stream, TLS__Types::HandshakeType& ret) { |
| if(!HandshakeType::is_valid_enum(oct2int(stream))){ |
| return 0; |
| } |
| ret = (HandshakeType) oct2int(stream); |
| return 1; |
| } |
| |
| ///////////////////////////////////// |
| //// Hello Request EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__HelloRequest(const HelloRequest& hr, TTCN_Buffer& buf) { |
| buf.put_os(OCTETSTRING(0, (const unsigned char*)"")); |
| } |
| |
| HelloRequest dec__TLS__HelloRequest(const OCTETSTRING& stream) { |
| HelloRequest ret = HelloRequest(NULL_VALUE); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Random EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__Random(const TLS__Types::Random& rnd, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(rnd.gmt__unix__time(), 4)); |
| buf.put_os(rnd.random__bytes()); |
| |
| } |
| |
| Random dec__TLS__Random(const OCTETSTRING& stream) throw(TLS_Exception){ |
| Random ret; |
| |
| ret.gmt__unix__time() = oct2int(substr(stream, 0, 4)); |
| ret.random__bytes() = substr(stream, 4, 28); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// SessionID EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__SessionID(const TLS__Types::SessionID& sid, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(sid.lengthof(), 1)); |
| buf.put_os((OCTETSTRING) sid); |
| } |
| |
| SessionID dec__TLS__SessionID(const OCTETSTRING& stream) { |
| SessionID ret = (SessionID) stream; |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Cipher Suite EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__CipherSuite(const TLS__Types::CipherSuite& cs, TTCN_Buffer& buf) { |
| buf.put_os(cs.field1()); |
| buf.put_os(cs.field2()); |
| } |
| |
| CipherSuite dec__TLS__CipherSuite(const OCTETSTRING& stream) throw(TLS_Exception){ |
| CipherSuite ret; |
| |
| if(stream.lengthof() < 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| |
| ret.field1() = substr(stream, 0, 1); |
| ret.field2() = substr(stream, 1, 1); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Cipher Suite List EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__CipherSuiteList(const TLS__Types::CipherSuiteList& csl, TTCN_Buffer& buf) { |
| int size = csl.size_of(); |
| |
| buf.put_os(int2oct(size*2, 2)); |
| for(int i = 0; i < size; i++){ |
| enc__TLS__CipherSuite(csl[i], buf); |
| } |
| } |
| |
| CipherSuiteList dec__TLS__CipherSuiteList(const OCTETSTRING& stream, const INTEGER& len) throw(TLS_Exception){ |
| CipherSuiteList ret; |
| int size = len/2; |
| if(stream.lengthof() != len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| for(int i = 0; i < size; i++){ |
| ret[i] = dec__TLS__CipherSuite(substr(stream, (i*2), 2)); |
| } |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Compression Method List EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__CompressionMethodList(const TLS__Types::CompressionMethodList& cml, TTCN_Buffer& buf) { |
| int size = (cml.size_of()); |
| |
| buf.put_os(int2oct(size, 1)); |
| for(int i = 0; i < size; i++){ |
| enc__TLS__CompressionMethod(cml[i], buf); |
| } |
| } |
| |
| CompressionMethodList dec__TLS__CompressionMethodList(const OCTETSTRING& stream, const INTEGER& len) throw(TLS_Exception){ |
| CompressionMethodList ret; |
| |
| if(stream.lengthof() != len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| |
| for(int i = 0; i < len; i++){ |
| ret[i] = dec__TLS__CompressionMethod(substr(stream, i, 1)); |
| } |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Client Hello EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ClientHello(const TLS__Types::ClientHello& hello, TTCN_Buffer& buf) { |
| enc__TLS__ProtocolVersion(hello.client__version(), buf); |
| enc__TLS__Random(hello.random(), buf); |
| if(hello.session__id().ispresent()){ |
| enc__TLS__SessionID(hello.session__id(), buf); |
| } else { |
| buf.put_c(0); |
| } |
| enc__TLS__CipherSuiteList(hello.cipher__suites(), buf); |
| enc__TLS__CompressionMethodList(hello.compression__methods(), buf); |
| |
| if(hello.extension__().ispresent()) { |
| buf.put_os(hello.extension__()()); |
| } |
| } |
| |
| ClientHello dec__TLS__ClientHello(const OCTETSTRING& stream) throw(TLS_Exception){ |
| ClientHello ret; |
| int offset = 0; |
| int len = 0; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.client__version() = dec__TLS__ProtocolVersion(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + 32) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.random() = dec__TLS__Random(substr(stream, offset, 32)); |
| offset += 32; |
| |
| if(str_len < offset + 1) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 1)); |
| offset += 1; |
| |
| if(len != 0) { |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.session__id() = dec__TLS__SessionID(substr(stream, offset, len)); |
| offset += len; |
| } else { |
| ret.session__id() = OMIT_VALUE; |
| } |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.cipher__suites() = dec__TLS__CipherSuiteList(substr(stream, offset, len), len); |
| offset += len; |
| |
| if(str_len < offset + 1) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream,offset, 1)); |
| offset += 1; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.compression__methods() = dec__TLS__CompressionMethodList(substr(stream, offset, len), len); |
| offset += len; |
| |
| if(str_len == offset){ |
| ret.extension__() = OMIT_VALUE; |
| } else { |
| ret.extension__()() = substr(stream, offset, str_len-offset); |
| } |
| |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Server Hello EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ServerHello(const TLS__Types::ServerHello& hello, TTCN_Buffer& buf) { |
| enc__TLS__ProtocolVersion(hello.server__version(), buf); |
| enc__TLS__Random(hello.random(), buf); |
| if(hello.session__id().ispresent()){ |
| enc__TLS__SessionID(hello.session__id(), buf); |
| } else { |
| buf.put_c(0); |
| } |
| enc__TLS__CipherSuite(hello.cipher__suite(), buf); |
| enc__TLS__CompressionMethod(hello.compression__method(), buf); |
| } |
| |
| ServerHello dec__TLS__ServerHello(const OCTETSTRING& stream) throw(TLS_Exception){ |
| ServerHello ret; |
| int offset = 0; |
| int len; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.server__version() = dec__TLS__ProtocolVersion(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + 32) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.random() = dec__TLS__Random(substr(stream, offset, 32)); |
| offset += 32; |
| |
| if(str_len < offset + 1) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 1)); |
| offset += 1; |
| |
| if(len != 0) { |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.session__id() = dec__TLS__SessionID(substr(stream, offset, len)); |
| offset += len; |
| } else { |
| ret.session__id() = OMIT_VALUE; |
| } |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.cipher__suite() = dec__TLS__CipherSuite(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + 1) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.compression__method() = dec__TLS__CompressionMethod(substr(stream, offset, 1)); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Certificate List EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__CertificateList(const TLS__Types::CertificateList& certl, TTCN_Buffer& buf) { |
| int size = certl.size_of(); |
| |
| for(int i = 0; i < size; i++){ |
| buf.put_os(int2oct(certl[i].lengthof(), 3)); |
| buf.put_os(certl[i]); |
| } |
| } |
| |
| CertificateList dec__TLS__CertificateList(const OCTETSTRING& stream, const INTEGER& stream_len) throw(TLS_Exception){ |
| CertificateList ret; |
| int len; |
| int i = 0; |
| int offset = 0; |
| if(stream_len != stream.lengthof()) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| do { |
| len = oct2int(substr(stream, offset, 3)); |
| offset += 3; |
| if(stream_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret[i] = substr(stream, offset, len); |
| offset += len; |
| i++; |
| } while(offset + 3 <= stream_len); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Certificate EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__Certificate(const TLS__Types::Certificate& cert, TTCN_Buffer& buf) { |
| int len=0; |
| int size = cert.certificate__list()().size_of(); |
| |
| for(int i = 0; i < size; i++){ |
| len += cert.certificate__list()()[i].lengthof(); |
| } |
| |
| buf.put_os(int2oct(len+3*size, 3)); |
| enc__TLS__CertificateList(cert.certificate__list(), buf); |
| } |
| |
| Certificate dec__TLS__Certificate(const OCTETSTRING& stream) throw(TLS_Exception){ |
| Certificate ret; |
| int len; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < 3) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, 0, 3)); |
| |
| if(str_len < len + 3) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.certificate__list() = dec__TLS__CertificateList(substr(stream, 3, len), len); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Key Exchange Algorithm EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__KeyExchangeAlgorithm(const TLS__Types::KeyExchangeAlgorithm& kea, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(kea, 1)); |
| } |
| |
| KeyExchangeAlgorithm dec__TLS__KeyExchangeAlgorithm(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!KeyExchangeAlgorithm::is_valid_enum(oct2int(stream))){ |
| TLS_Exception e; |
| e.what = (const char*)"Invalid KeyExchangeAlgorithm"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| KeyExchangeAlgorithm ret = (KeyExchangeAlgorithm) oct2int(stream); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Server RSA Params EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ServerRSAParams(const TLS__Types::ServerRSAParams& srsap, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(srsap.rsa__modulus().lengthof(), 2)); |
| buf.put_os(srsap.rsa__modulus()); |
| buf.put_os(int2oct(srsap.rsa__exponent().lengthof(), 2)); |
| buf.put_os(srsap.rsa__exponent()); |
| } |
| |
| ServerRSAParams dec__TLS__ServerRSAParams(const OCTETSTRING& stream) throw(TLS_Exception){ |
| ServerRSAParams ret; |
| int offset = 0; |
| int len = 0; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.rsa__modulus() = substr(stream, offset, len); |
| offset += len; |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.rsa__exponent() = substr(stream, offset, len); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Server DH Params EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ServerDHParams(const TLS__Types::ServerDHParams& sdhp, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(sdhp.dh__p().lengthof(), 2)); |
| buf.put_os(sdhp.dh__p()); |
| buf.put_os(int2oct(sdhp.dh__g().lengthof(), 2)); |
| buf.put_os(sdhp.dh__g()); |
| buf.put_os(int2oct(sdhp.dh__Ys().lengthof(), 2)); |
| buf.put_os(sdhp.dh__Ys()); |
| } |
| |
| ServerDHParams dec__TLS__ServerDHParams(const OCTETSTRING& stream) throw(TLS_Exception){ |
| ServerDHParams ret; |
| int offset = 0; |
| int len; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.dh__p() = substr(stream, offset, len); |
| offset += len; |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.dh__g() = substr(stream, offset, len); |
| offset += len; |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.dh__Ys() = substr(stream, offset, len); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// RSA Signature EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__RSASignature(const TLS__Types::RSASignature& rsasign, TTCN_Buffer& buf) { |
| buf.put_os(rsasign.md5__hash()); |
| buf.put_os(rsasign.sha__hash()); |
| } |
| |
| RSASignature dec__TLS__RSASignature(const OCTETSTRING& stream) throw(TLS_Exception){ |
| RSASignature ret; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < 36) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| |
| ret.md5__hash() = substr(stream, 0, 16); |
| ret.sha__hash() = substr(stream, 16, 20); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// DSA Signature EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__DSASignature(const TLS__Types::DSASignature& dsasign, TTCN_Buffer& buf) { |
| buf.put_os(dsasign.sha__hash()); |
| } |
| |
| DSASignature dec__TLS__DSASignature(const OCTETSTRING& stream) throw(TLS_Exception){ |
| DSASignature ret; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < 20) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.sha__hash() = substr(stream, 0, 20); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Anonym Signature EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__AnonymSignature(const TLS__Types::AnonymSignature& anonsign, TTCN_Buffer& buf) { |
| buf.put_os(OCTETSTRING(0, (const unsigned char*)"")); |
| } |
| |
| AnonymSignature dec__TLS__AnonymSignature(const OCTETSTRING& stream) { |
| AnonymSignature ret = AnonymSignature(NULL_VALUE); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Signature EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__Signature(const TLS__Types::Signature& sign, TTCN_Buffer& buf) { |
| switch(sign.get_selection()){ |
| case Signature::ALT_anonym : enc__TLS__AnonymSignature(sign.anonym(), buf); break; |
| case Signature::ALT_rsa : enc__TLS__RSASignature(sign.rsa(), buf); break; |
| case Signature::ALT_dsa : enc__TLS__DSASignature(sign.dsa(), buf); break; |
| default : ; |
| } |
| } |
| |
| Signature dec__TLS__Signature(const OCTETSTRING& stream) throw(TLS_Exception){ |
| Signature ret; |
| switch(stream.lengthof()){ |
| case 0 : ret.anonym() = dec__TLS__AnonymSignature(stream); break; |
| case 36 : ret.rsa() = dec__TLS__RSASignature(stream); break; |
| case 20 : ret.dsa() = dec__TLS__DSASignature(stream); break; |
| default : ; |
| } |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Server Params EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ServerParams(const TLS__Types::ServerParams& sp, TTCN_Buffer& buf) { |
| switch(sp.get_selection()){ |
| case ServerParams::ALT_dh__params : enc__TLS__ServerDHParams(sp.dh__params(), buf); break; |
| case ServerParams::ALT_rsa__params : enc__TLS__ServerRSAParams(sp.rsa__params(), buf); break; |
| default : |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("Wrong field was selected from ServerParams"); |
| TTCN_Logger::end_event(); |
| |
| } |
| } |
| |
| ServerParams dec__TLS__ServerParams(const OCTETSTRING& stream) throw(TLS_Exception){ |
| ServerParams ret; |
| int len; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, 0, 2)); |
| len += oct2int(substr(stream, len + 2, len + 4)); |
| |
| ret.dh__params() = dec__TLS__ServerDHParams(stream); |
| if((len + 4) == str_len){ |
| ret.rsa__params() = dec__TLS__ServerRSAParams(stream); |
| } else { |
| ret.dh__params() = dec__TLS__ServerDHParams(stream); |
| } |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Server Key Exchange EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ServerKeyExchange(const TLS__Types::ServerKeyExchange& ske, TTCN_Buffer& buf) { |
| enc__TLS__ServerParams(ske.params(), buf); |
| enc__TLS__Signature(ske.signed__params(), buf); |
| } |
| |
| ServerKeyExchange dec__TLS__ServerKeyExchange(const OCTETSTRING& stream, const TLS__Types::KeyExchangeAlgorithm& kea) throw(TLS_Exception){ |
| ServerKeyExchange ret; |
| int len = 0; |
| int offset = 0; |
| int str_len = stream.lengthof(); |
| OCTETSTRING p1; |
| OCTETSTRING p2; |
| OCTETSTRING p3; |
| |
| switch(kea){ |
| case KeyExchangeAlgorithm::diffie__hellman : |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| p1 = substr(stream, offset, len); |
| offset += len; |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| p2 = substr(stream, offset, len); |
| offset += len; |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| p3 = substr(stream, offset, len); |
| offset += len; |
| |
| ret.params().dh__params().dh__p() = p1; |
| ret.params().dh__params().dh__g() = p2; |
| ret.params().dh__params().dh__Ys() = p3; |
| |
| break; |
| |
| case KeyExchangeAlgorithm::rsa : |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| p1 = substr(stream, offset, len); |
| offset += len; |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| p2 = substr(stream, offset, len); |
| offset += len; |
| |
| ret.params().rsa__params().rsa__modulus() = p1; |
| ret.params().rsa__params().rsa__exponent() = p2; |
| |
| break; |
| |
| default : break; |
| } |
| |
| ret.signed__params() = dec__TLS__Signature(substr(stream, offset, str_len - offset)); |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Signature Algorithm EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__SignatureAlgorithm(const TLS__Types::SignatureAlgorithm& sa, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(sa, 1)); |
| } |
| |
| SignatureAlgorithm dec__TLS__SignatureAlgorithm(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!SignatureAlgorithm::is_valid_enum(oct2int(stream))) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid SignatureAlgorithm"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| SignatureAlgorithm ret = (SignatureAlgorithm) oct2int(stream); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Client Certificate Type EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ClientCertificateType(const TLS__Types::ClientCertificateType& cct, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(cct, 1)); |
| } |
| |
| ClientCertificateType dec__TLS__ClientCertificateType(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!ClientCertificateType::is_valid_enum(oct2int(stream))) { |
| return ClientCertificateType::UNKNOWN_VALUE; |
| // TLS_Exception e; |
| // e.what = (const char*)"Invalid ClientCertificateType"; |
| // e.file = (const char*)__FILE__; |
| // e.line = __LINE__-4; |
| // e.func = __func__; |
| // throw e; |
| } |
| ClientCertificateType ret = (ClientCertificateType) oct2int(stream); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Client Certificate Type List EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ClientCertificateTypeList(const TLS__Types::ClientCertificateTypeList& cctl, TTCN_Buffer& buf) { |
| int size = cctl.size_of(); |
| |
| buf.put_os(int2oct(size, 1)); |
| for(int i = 0; i < size; i++){ |
| enc__TLS__ClientCertificateType(cctl[i], buf); |
| } |
| } |
| |
| ClientCertificateTypeList dec__TLS__ClientCertificateTypeList(const OCTETSTRING& stream, const INTEGER& size) throw(TLS_Exception){ |
| ClientCertificateTypeList ret; |
| if(stream.lengthof() < size) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid ClientCertificateTypeList"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| for(int i = 0; i < size; i++){ |
| ret[i] = dec__TLS__ClientCertificateType(substr(stream, i, 1)); |
| } |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Distinguished Name EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__DistinguishedName(const TLS__Types::DistinguishedName& dn, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(dn.lengthof(), 2)); |
| buf.put_os(dn); |
| } |
| |
| DistinguishedName dec__TLS__DistinguishedName(const OCTETSTRING& stream) throw(TLS_Exception){ |
| DistinguishedName ret; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| int len = oct2int(substr(stream, 0, 2)); |
| if(len != 0) { |
| if(str_len < len + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret = substr(stream, 2, len); |
| } else { |
| ret = OCTETSTRING(0,NULL); |
| } |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Certificate Request EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__CertificateRequest(const TLS__Types::CertificateRequest& cr, TTCN_Buffer& buf) { |
| enc__TLS__ClientCertificateTypeList(cr.certificate__types(), buf); |
| buf.put_os(int2oct(cr.certificate__authorities()().lengthof()+2, 2)); |
| if(cr.certificate__authorities().ispresent()){ |
| enc__TLS__DistinguishedName(cr.certificate__authorities(), buf); |
| } else { |
| buf.put_os(OCTETSTRING(2, (const unsigned char*)"0000")); |
| } |
| } |
| |
| CertificateRequest dec__TLS__CertificateRequest(const OCTETSTRING& stream) throw(TLS_Exception){ |
| CertificateRequest ret; |
| int offset = 0; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < offset + 1) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| int len = oct2int(substr(stream, 0, 1)); |
| offset += 1; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.certificate__types() = dec__TLS__ClientCertificateTypeList(substr(stream, offset, len), len); |
| offset += len; |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + len) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| if (len == 0) { |
| ret.certificate__authorities() = OMIT_VALUE; |
| } else { |
| ret.certificate__authorities() = dec__TLS__DistinguishedName(substr(stream, offset, len)); |
| } |
| |
| if(!ret.certificate__authorities().is_bound()){ |
| ret.certificate__authorities() = OMIT_VALUE; |
| } |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Server Hello Done EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ServerHelloDone(const ServerHelloDone& shd, TTCN_Buffer& buf) { |
| buf.put_os(OCTETSTRING(0, (const unsigned char*)"")); |
| } |
| |
| ServerHelloDone dec__TLS__ServerHelloDone(const OCTETSTRING& stream) { |
| return ServerHelloDone(NULL_VALUE); |
| } |
| |
| ///////////////////////////////////// |
| //// Certificate Verify EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__CertificateVerify(const TLS__Types::CertificateVerify& cv, TTCN_Buffer& buf) { |
| /*enc__TLS__Signature(cv.signature__(), buf);*/ |
| buf.put_os(cv.signature__()); |
| } |
| |
| CertificateVerify dec__TLS__CertificateVerify(const OCTETSTRING& stream) { |
| CertificateVerify ret; |
| |
| //ret.signature__() = dec__TLS__Signature(stream); |
| ret.signature__() = stream; |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Public Value Encoding EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__PublicValueEncoding(const TLS__Types::PublicValueEncoding& pve, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(pve, 1)); |
| } |
| |
| PublicValueEncoding dec__TLS__PublicValueEncoding(const OCTETSTRING& stream) throw(TLS_Exception){ |
| if(!PublicValueEncoding::is_valid_enum(oct2int(stream))) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid PublicValueEncoding"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| PublicValueEncoding ret = (PublicValueEncoding) oct2int(stream); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Premaster Secret EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__PreMasterSecret(const TLS__Types::PreMasterSecret& ps, TTCN_Buffer& buf) { |
| enc__TLS__ProtocolVersion(ps.client__version(), buf); |
| buf.put_os(ps.random()); |
| } |
| |
| PreMasterSecret dec__TLS__PreMasterSecret(const OCTETSTRING& stream) throw(TLS_Exception){ |
| PreMasterSecret ret; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.client__version() = dec__TLS__ProtocolVersion(substr(stream, 0, 2)); |
| |
| if(str_len < 48) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.random() = substr(stream, 2, 46); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Encrypted PreMaster Secret EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__EncryptedPreMasterSecret(const TLS__Types::EncryptedPreMasterSecret epms, TTCN_Buffer& buf) { |
| enc__TLS__PreMasterSecret(epms.pre__master__secret(), buf); |
| } |
| |
| EncryptedPreMasterSecret dec__TLS__EncryptedPreMasterSecret(const OCTETSTRING& stream) { |
| EncryptedPreMasterSecret ret; |
| |
| ret.pre__master__secret() = dec__TLS__PreMasterSecret(stream); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Client Diffie Hellman Public Implicit EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ClientDiffieHellmanPublicImplicit(const TLS__Types::ClientDiffieHellmanPublicImplicit cdhpi, TTCN_Buffer& buf) { |
| buf.put_os(OCTETSTRING(0, (const unsigned char*)"")); |
| } |
| |
| ClientDiffieHellmanPublicImplicit dec__TLS__ClientDiffieHellmanPublicImplicit(const OCTETSTRING& stream) { |
| return ClientDiffieHellmanPublicImplicit(NULL_VALUE); |
| } |
| |
| ///////////////////////////////////// |
| //// Client Diffie Hellman Public Explicit EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ClientDiffieHellmanPublicExplicit(const TLS__Types::ClientDiffieHellmanPublicExplicit cdhpe, TTCN_Buffer& buf) { |
| buf.put_os(int2oct(cdhpe.DH__Yc().lengthof(), 2)); |
| buf.put_os(cdhpe.DH__Yc()); |
| } |
| |
| ClientDiffieHellmanPublicExplicit dec__TLS__ClientDiffieHellmanPublicExplicit(const OCTETSTRING& stream) throw(TLS_Exception){ |
| ClientDiffieHellmanPublicExplicit ret; |
| int len; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, 0, 2)); |
| |
| if(str_len < len + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.DH__Yc() = substr(stream, 2, len); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Client Diffie Hellman Public Values EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ClientDiffieHellmanPublicValues(const TLS__Types::ClientDiffieHellmanPublicValues cdhpv, const TLS__Types::PublicValueEncoding pve, TTCN_Buffer& buf) { |
| switch(pve) { |
| case PublicValueEncoding::implicit : enc__TLS__ClientDiffieHellmanPublicImplicit(cdhpv.implicit(), buf); break; |
| case PublicValueEncoding::explicit__ : enc__TLS__ClientDiffieHellmanPublicExplicit(cdhpv.explicit__(), buf); break; |
| default : |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("Wrong field was selected from ClientDiffieHellmanPublicValues"); |
| TTCN_Logger::end_event(); |
| } |
| } |
| |
| ClientDiffieHellmanPublicValues dec__TLS__ClientDiffieHellmanPublicValues(const OCTETSTRING& stream, const TLS__Types::PublicValueEncoding pve) { |
| ClientDiffieHellmanPublicValues ret; |
| |
| switch(pve) { |
| case PublicValueEncoding::implicit : ret.implicit() = dec__TLS__ClientDiffieHellmanPublicImplicit(stream); break; |
| case PublicValueEncoding::explicit__ : ret.explicit__() = dec__TLS__ClientDiffieHellmanPublicExplicit(stream); break; |
| default : |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("Wrong field was selected from ClientDiffieHellmanPublicValues"); |
| TTCN_Logger::end_event(); |
| } |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Client Diffie Hellman Public EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ClientDiffieHellmanPublic(const TLS__Types::ClientDiffieHellmanPublic cdhp, TTCN_Buffer& buf) { |
| PublicValueEncoding pve; |
| |
| if(cdhp.dh__public().get_selection() == ClientDiffieHellmanPublicValues::ALT_implicit){ |
| pve = PublicValueEncoding::implicit; |
| } else { |
| pve = PublicValueEncoding::explicit__; |
| } |
| |
| enc__TLS__ClientDiffieHellmanPublicValues(cdhp.dh__public(), pve, buf); |
| } |
| |
| ClientDiffieHellmanPublic dec__TLS__ClientDiffieHellmanPublic(const OCTETSTRING& stream) { |
| ClientDiffieHellmanPublic ret; |
| PublicValueEncoding pve; |
| |
| if(stream.lengthof() == 0){ |
| pve = PublicValueEncoding::implicit; |
| } else { |
| pve = PublicValueEncoding::explicit__; |
| } |
| |
| ret.dh__public() = dec__TLS__ClientDiffieHellmanPublicValues(stream, pve); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Client Key Exchange Keys EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ClientKeyExchangeKeys(const TLS__Types::ClientKeyExchangeKeys ckek, const TLS__Types::KeyExchangeAlgorithm& kea, TTCN_Buffer& buf) { |
| switch(kea){ |
| case KeyExchangeAlgorithm::rsa : enc__TLS__EncryptedPreMasterSecret(ckek.rsa(), buf); break; |
| case KeyExchangeAlgorithm::diffie__hellman : enc__TLS__ClientDiffieHellmanPublic(ckek.diffie__hellman(), buf); break; |
| default : |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("Wrong field was selected from ClientKeyExchangeKeys"); |
| TTCN_Logger::end_event(); |
| } |
| } |
| |
| ClientKeyExchangeKeys dec__TLS__ClientKeyExchangeKeys(const OCTETSTRING& stream, const TLS__Types::KeyExchangeAlgorithm& kea) { |
| ClientKeyExchangeKeys ret; |
| |
| switch(kea){ |
| case KeyExchangeAlgorithm::rsa : ret.rsa() = dec__TLS__EncryptedPreMasterSecret(stream); break; |
| case KeyExchangeAlgorithm::diffie__hellman : ret.diffie__hellman() = dec__TLS__ClientDiffieHellmanPublic(stream); break; |
| default : |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("Wrong field was selected from ClientKeyExchangeKeys"); |
| TTCN_Logger::end_event(); |
| }; |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Client Key Exchange EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__ClientKeyExchange(const TLS__Types::ClientKeyExchange& cke, TTCN_Buffer& buf) { |
| /*KeyExchangeAlgorithm kea; |
| |
| if(cke.exchange__keys().get_selection() == ClientKeyExchangeKeys::ALT_rsa) { |
| kea = KeyExchangeAlgorithm::rsa; |
| } else { |
| kea = KeyExchangeAlgorithm::diffie__hellman; |
| } |
| |
| enc__TLS__ClientKeyExchangeKeys(cke.exchange__keys(), kea, buf);*/ |
| buf.put_os(cke.exchange__keys()); |
| } |
| |
| ClientKeyExchange dec__TLS__ClientKeyExchange(const OCTETSTRING& stream) { |
| ClientKeyExchange ret; |
| /*KeyExchangeAlgorithm kea; |
| |
| if(stream.lengthof() == 48) { |
| kea = KeyExchangeAlgorithm::rsa; |
| } else { |
| kea = KeyExchangeAlgorithm::diffie__hellman; |
| } |
| |
| ret.exchange__keys() = dec__TLS__ClientKeyExchangeKeys(stream, kea);*/ |
| |
| ret.exchange__keys() = stream; |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Finished EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__Finished(const TLS__Types::Finished& fin, TTCN_Buffer& buf) { |
| buf.put_os(fin.verify__data()); |
| } |
| |
| Finished dec__TLS__Finished(const OCTETSTRING& stream) { |
| Finished ret; |
| |
| ret.verify__data() = stream; |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Handshake Body EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__HandshakeBody(const TLS__Types::HandshakeBody& body, const TLS__Types::HandshakeType& type, TTCN_Buffer& buf) { |
| switch(type){ |
| case HandshakeType::hello__request : enc__TLS__HelloRequest(body.hello__request(), buf); break; |
| case HandshakeType::client__hello : enc__TLS__ClientHello(body.client__hello(), buf); break; |
| case HandshakeType::server__hello : enc__TLS__ServerHello(body.server__hello(), buf); break; |
| case HandshakeType::certificate : enc__TLS__Certificate(body.certificate(), buf); break; |
| case HandshakeType::server__key__exchange : enc__TLS__ServerKeyExchange(body.server__key__exchange(), buf); break; |
| case HandshakeType::certificate__request : enc__TLS__CertificateRequest(body.certificate__request(), buf); break; |
| case HandshakeType::server__hello__done : enc__TLS__ServerHelloDone(body.server__hello__done(), buf); break; |
| case HandshakeType::certificate__verify : enc__TLS__CertificateVerify(body.certificate__verify(), buf); break; |
| case HandshakeType::client__key__exchange : enc__TLS__ClientKeyExchange(body.client__key__exchange(), buf); break; |
| case HandshakeType::finished : enc__TLS__Finished(body.finished(), buf); break; |
| default : |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("Wrong field was selected from HandshakeBody"); |
| TTCN_Logger::end_event(); |
| } |
| } |
| |
| HandshakeBody dec__TLS__HandshakeBody(const OCTETSTRING& stream, const TLS__Types::HandshakeType& type, const TLS__Types::KeyExchangeAlgorithm& kea) { |
| HandshakeBody ret; |
| switch(type){ |
| case HandshakeType::hello__request : ret.hello__request() = dec__TLS__HelloRequest(stream); break; |
| case HandshakeType::client__hello : ret.client__hello() = dec__TLS__ClientHello(stream); break; |
| case HandshakeType::server__hello : ret.server__hello() = dec__TLS__ServerHello(stream); break; |
| case HandshakeType::certificate : ret.certificate() = dec__TLS__Certificate(stream); break; |
| case HandshakeType::server__key__exchange : ret.server__key__exchange() = dec__TLS__ServerKeyExchange(stream, kea); break; |
| case HandshakeType::certificate__request : ret.certificate__request() = dec__TLS__CertificateRequest(stream); break; |
| case HandshakeType::server__hello__done : ret.server__hello__done() = dec__TLS__ServerHelloDone(stream); break; |
| case HandshakeType::certificate__verify : ret.certificate__verify() = dec__TLS__CertificateVerify(stream); break; |
| case HandshakeType::client__key__exchange : ret.client__key__exchange() = dec__TLS__ClientKeyExchange(stream); break; |
| case HandshakeType::finished : ret.finished() = dec__TLS__Finished(stream); break; |
| default : |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("Wrong field was selected from HandshakeBody"); |
| TTCN_Logger::end_event(); |
| } |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Handshake Enc |
| ///////////////////////////////////// |
| |
| void enc__TLS__Handshake(const TLS__Types::Handshake& hs, TTCN_Buffer& buf) { |
| TTCN_Buffer temp_buf; |
| if(hs.msg__type().ispresent()) { |
| enc__TLS__HandshakeType(hs.msg__type(), buf); |
| enc__TLS__HandshakeBody(hs.body(), hs.msg__type(), temp_buf); |
| buf.put_os(int2oct(temp_buf.get_len(), 3)); |
| buf.put_buf(temp_buf); |
| } else { |
| buf.put_os(hs.body().encrypted()); |
| } |
| } |
| |
| ///////////////////////////////////// |
| //// Multiple Handshake EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__MultipleHandshake(const TLS__Types::MultipleHandshake& hs, TTCN_Buffer& buf) { |
| for(int i = 0; i < hs.size_of(); i++){ |
| enc__TLS__Handshake(hs[i], buf); |
| } |
| } |
| |
| MultipleHandshake dec__TLS__MultipleHandshake(const OCTETSTRING& stream, const TLS__Types::KeyExchangeAlgorithm& kea) throw(TLS_Exception){ |
| MultipleHandshake ret; |
| int offset = 0; |
| int i = 0; |
| int str_len = stream.lengthof(); |
| |
| do { |
| if(str_len < offset + 1) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| int res = dec__TLS__HandshakeType(substr(stream, offset, 1), ret[i].msg__type()()); |
| if(res != 1){ |
| ret[i].body().encrypted() = substr(stream, offset, str_len - offset); |
| ret[i].msg__type() = OMIT_VALUE; |
| ret[i].length__() = OMIT_VALUE; |
| return ret; |
| } |
| offset += 1; |
| |
| if(str_len < offset + 3) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret[i].length__() = oct2int(substr(stream, offset, 3)); |
| offset += 3; |
| try { |
| ret[i].body() = dec__TLS__HandshakeBody(substr(stream, offset, ret[i].length__()()), ret[i].msg__type()(), kea); |
| } catch (TLS_Exception e) { |
| ret[i].body().encrypted() = substr(stream, offset, str_len - offset); |
| ret[i].msg__type() = OMIT_VALUE; |
| ret[i].length__() = OMIT_VALUE; |
| return ret; |
| } |
| offset += ret[i].length__()(); |
| i++; |
| } while(offset < str_len); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Content EncDec |
| ///////////////////////////////////// |
| |
| OCTETSTRING enc__TLS__Content(const TLS__Types::Content& cont, const TLS__Types::ContentType& ctype, TTCN_Buffer& buf){ |
| OCTETSTRING ret; |
| switch(ctype) { |
| case ContentType::change__cipher__spec : enc__TLS__ChangeCipherSpec(cont.change__cipher__spec(), buf); break; |
| case ContentType::alert : enc__TLS__Alert(cont.alert(), buf); break; |
| case ContentType::handshake : enc__TLS__MultipleHandshake(cont.multiple__handshake(), buf); break; |
| case ContentType::application__data : buf.put_os(cont.application__data()); break; |
| default : |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("Wrong field was selected from Content"); |
| TTCN_Logger::end_event(); |
| } |
| buf.get_string(ret); |
| |
| return ret; |
| |
| } |
| |
| Content dec__TLS__Content(const OCTETSTRING& stream, const TLS__Types::ContentType& ctype, const KeyExchangeAlgorithm& kea){ |
| Content ret; |
| |
| switch(ctype) { |
| case ContentType::change__cipher__spec : ret.change__cipher__spec() = dec__TLS__ChangeCipherSpec(stream); break; |
| case ContentType::alert : ret.alert() = dec__TLS__Alert(stream); break; |
| case ContentType::handshake : ret.multiple__handshake() = dec__TLS__MultipleHandshake(stream, kea); break; |
| case ContentType::application__data : ret.application__data() = stream; break; |
| default : |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("Wrong field was selected from Content"); |
| TTCN_Logger::end_event(); |
| } |
| |
| return ret; |
| |
| } |
| |
| ///////////////////////////////////// |
| //// TLS Plaintext EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__TLSPlaintext(const TLS__Types::TLSPlaintext& text, TTCN_Buffer& buf) { |
| TTCN_Buffer temp_buf; |
| enc__TLS__ContentType(text.type__(), buf); |
| enc__TLS__ProtocolVersion(text.version(), buf); |
| enc__TLS__Content(text.fragment(), text.type__(), temp_buf); |
| buf.put_os(int2oct(temp_buf.get_len(), 2)); |
| buf.put_buf(temp_buf); |
| } |
| |
| TLSPlaintext dec__TLS__TLSPlaintext(const OCTETSTRING& stream, const TLS__Types::KeyExchangeAlgorithm& kea) { |
| TLSPlaintext ret; |
| int str_len = stream.lengthof(); |
| int offset = 0; |
| |
| if(str_len < offset + 1) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.type__() = dec__TLS__ContentType( substr(stream, offset, 1)); |
| |
| offset += 1; |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.version() = dec__TLS__ProtocolVersion( substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset + 2) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.length__() = oct2int(substr( stream, offset, 2)); |
| offset += 2; |
| |
| if(str_len < offset) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.fragment() = dec__TLS__Content(substr(stream, offset, str_len - offset), ret.type__(), kea); |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// TLS Plaintexts EncDec |
| ///////////////////////////////////// |
| |
| OCTETSTRING enc__TLS__TLSPlaintexts(const TLS__Types::TLSPlaintexts& texts) { |
| TTCN_Buffer buf; |
| OCTETSTRING ret; |
| int size = texts.size_of(); |
| |
| for(int i = 0; i < size; i++) { |
| enc__TLS__TLSPlaintext(texts[i], buf); |
| } |
| |
| buf.get_string(ret); |
| |
| return ret; |
| } |
| |
| INTEGER dec__TLS__TLSPlaintexts(const OCTETSTRING& stream, TLS__Types::TLSPlaintexts& ret, const TLS__Types::KeyExchangeAlgorithm& kea=TLS__Types::KeyExchangeAlgorithm::null__) { |
| int str_len = stream.lengthof(); |
| int offset = 0; |
| int len; |
| int i = 0; |
| do { |
| try { |
| if(str_len < offset + 5) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| len = oct2int(substr(stream, offset + 3, 2)); |
| |
| if(str_len < offset + len + 5) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret[i] = dec__TLS__TLSPlaintext(substr(stream, offset, len + 5), kea); |
| } catch (TLS_Exception e) { |
| TTCN_Logger::begin_event(TTCN_USER); |
| TTCN_Logger::log_event("***Error has occured: %s. In file: %s in function: %s at line: %d", e.what, e.file, e.func, e.line); |
| TTCN_Logger::end_event(); |
| return 0; |
| } |
| |
| i++; |
| offset += len + 5; |
| } while(offset != str_len); |
| |
| return 1; |
| } |
| |
| ///////////////////////////////////// |
| //// TLS Compressed EncDec |
| ///////////////////////////////////// |
| |
| OCTETSTRING enc__TLS__TLSCompressed(const TLS__Types::TLSCompressed& text) { |
| TTCN_Buffer buf; |
| TTCN_Buffer temp_buf; |
| OCTETSTRING ret; |
| |
| enc__TLS__ContentType(text.type__(), buf); |
| enc__TLS__ProtocolVersion(text.version(), buf); |
| enc__TLS__Content(text.fragment(), text.type__(), temp_buf); |
| buf.put_os(int2oct(temp_buf.get_len(), 2)); |
| buf.put_buf(temp_buf); |
| |
| buf.get_string(ret); |
| |
| return ret; |
| } |
| |
| INTEGER dec__TLS__TLSCompressed(const OCTETSTRING& stream, TLS__Types::TLSCompressed& ret, const TLS__Types::KeyExchangeAlgorithm& kea=TLS__Types::KeyExchangeAlgorithm::null__) { |
| int stream_len = stream.lengthof(); |
| int offset = 0; |
| |
| if(stream_len > 5) { |
| try{ |
| ret.type__() = dec__TLS__ContentType(substr(stream, offset, 1)); |
| offset += 1; |
| |
| ret.version() = dec__TLS__ProtocolVersion(substr(stream, offset, 2)); |
| offset += 2; |
| |
| ret.length__() = oct2int(substr(stream, offset, 2)); |
| offset += 2; |
| |
| if(stream_len - offset == ret.length__()) { |
| ret.fragment() = dec__TLS__Content(substr( stream, offset, stream_len - offset), ret.type__(), kea); |
| return 1; |
| } |
| } catch (TLS_Exception e) { |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("***Error has occured: %s. In file: %s in function: %s at line: %d", e.what, e.file, e.func, e.line); |
| TTCN_Logger::end_event(); |
| return 0; |
| } |
| } |
| return 0; |
| } |
| |
| ///////////////////////////////////// |
| //// Generic Stream Cipher EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__GenericStreamCipher(const TLS__Types::GenericStreamCipher& gsc, const TLS__Types::TLSCompressed& cmpd, const TLS__Types::SecurityParameters& sp, TTCN_Buffer& buf) { |
| buf.put_os(padd_os_to_len(enc__TLS__Content(gsc.content(), cmpd.type__(), buf), cmpd.length__())); |
| buf.put_os(padd_os_to_len(gsc.mac(), sp.hash__size())); |
| } |
| |
| GenericStreamCipher dec__TLS__GenericStreamCipher(const OCTETSTRING& stream, const TLS__Types::TLSCompressed& cmpd, const TLS__Types::SecurityParameters& sp, const KeyExchangeAlgorithm& kea) throw(TLS_Exception){ |
| GenericStreamCipher ret; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < cmpd.length__()) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.content() = dec__TLS__Content(substr(stream, 0, cmpd.length__()), cmpd.type__(), kea); |
| |
| if(str_len < cmpd.length__() + sp.hash__size()) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.mac() = substr(stream, cmpd.length__(), sp.hash__size()); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Generic Block Cipher EncDec |
| ///////////////////////////////////// |
| |
| void enc__TLS__GenericBlockCipher(const TLS__Types::GenericBlockCipher& gbc, const TLS__Types::TLSCompressed& cmpd, const TLS__Types::SecurityParameters& sp, TTCN_Buffer& buf) { |
| buf.put_os(gbc.iv()); |
| buf.put_os(padd_os_to_len(enc__TLS__Content(gbc.content(), cmpd.type__(), buf), cmpd.length__())); |
| buf.put_os(padd_os_to_len(gbc.mac(), sp.hash__size())); |
| buf.put_os(int2oct(gbc.padding(), 1)); |
| buf.put_os(int2oct(gbc.padding__length(), 1)); |
| } |
| |
| GenericBlockCipher dec__TLS__GenericBlockCipher(const OCTETSTRING& stream, const TLS__Types::TLSCompressed& cmpd, const TLS__Types::SecurityParameters& sp, const KeyExchangeAlgorithm& kea) throw(TLS_Exception){ |
| GenericBlockCipher ret; |
| int str_len = stream.lengthof(); |
| |
| if(str_len < 2+cmpd.length__()+sp.hash__size()) { |
| TLS_Exception e; |
| e.what = (const char*)"Invalid length"; |
| e.file = (const char*)__FILE__; |
| e.line = __LINE__-4; |
| e.func = __func__; |
| throw e; |
| } |
| ret.padding__length() = oct2int(substr(stream, str_len-1, 1)); |
| ret.padding() = oct2int(substr(stream, str_len-2, 1)); |
| ret.mac() = substr(stream, str_len-2-sp.hash__size(), sp.hash__size()); |
| ret.content() = dec__TLS__Content(substr(stream, str_len-2-sp.hash__size()-cmpd.length__(), cmpd.length__()), cmpd.type__(), kea); |
| ret.iv() = substr(stream, 0, str_len-2-cmpd.length__()-sp.hash__size()); |
| |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// Cipher Spec Type EncDec |
| ///////////////////////////////////// |
| |
| OCTETSTRING enc__TLS__CipherSpecType(const TLS__Types::CipherSpecType& cst, const TLS__Types::TLSCompressed& cmpd, const TLS__Types::SecurityParameters& sp, TTCN_Buffer& buf) { |
| OCTETSTRING ret; |
| switch(cst.get_selection()){ |
| case CipherSpecType::ALT_stream : enc__TLS__GenericStreamCipher(cst.stream(), cmpd, sp, buf); break; |
| case CipherSpecType::ALT_block : enc__TLS__GenericBlockCipher(cst.block(), cmpd, sp, buf); break; |
| default : |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("Wrong field was selected from CipherSpecType"); |
| TTCN_Logger::end_event(); |
| } |
| |
| buf.get_string(ret); |
| |
| return ret; |
| } |
| |
| CipherSpecType dec__TLS__CipherSpecType(const OCTETSTRING& stream, const TLS__Types::TLSCompressed& cmpd, const TLS__Types::SecurityParameters& sp, const TLS__Types::KeyExchangeAlgorithm& kea) { |
| CipherSpecType ret; |
| if(stream.lengthof() == cmpd.length__() + sp.hash__size()) |
| ret.stream() = dec__TLS__GenericStreamCipher(stream, cmpd, sp, kea); |
| else |
| ret.block() = dec__TLS__GenericBlockCipher(stream, cmpd, sp, kea); |
| |
| return ret; |
| } |
| |
| ///////////////////////////////////// |
| //// TLS Ciphertext EncDec |
| ///////////////////////////////////// |
| |
| OCTETSTRING enc__TLS__TLSCiphertext(const TLS__Types::TLSCiphertext& text, const TLS__Types::TLSCompressed& cmpd, const TLS__Types::SecurityParameters& sp) { |
| TTCN_Buffer buf; |
| TTCN_Buffer temp_buf; |
| OCTETSTRING ret; |
| |
| enc__TLS__ContentType(text.type__(), buf); |
| enc__TLS__ProtocolVersion(text.version(), buf); |
| enc__TLS__CipherSpecType(text.fragment(), cmpd, sp, temp_buf); |
| buf.put_os(int2oct(temp_buf.get_len(), 2)); |
| buf.put_buf(temp_buf); |
| |
| buf.get_string(ret); |
| |
| return ret; |
| } |
| |
| INTEGER dec__TLS__TLSCiphertext(const OCTETSTRING& stream, const TLS__Types::TLSCompressed& cmpd, const TLS__Types::SecurityParameters& sp, const TLS__Types::KeyExchangeAlgorithm& kea, TLS__Types::TLSCiphertext& ret) { |
| int stream_len = stream.lengthof(); |
| |
| if(stream_len > 5){ |
| try { |
| ret.type__() = dec__TLS__ContentType(substr(stream, 0, 1)); |
| ret.version() = dec__TLS__ProtocolVersion(substr(stream, 1, 2)); |
| ret.length__() = oct2int(substr(stream, 3, 2)); |
| if(ret.length__() == stream_len - 5){ |
| ret.fragment() = dec__TLS__CipherSpecType(substr(stream, 5, stream_len - 5), cmpd, sp, kea); |
| return 1; |
| } |
| } catch (TLS_Exception e) { |
| TTCN_Logger::begin_event(TTCN_WARNING); |
| TTCN_Logger::log_event("***Error has occured: %s. In file: %s in function: %s at line: %d", e.what, e.file, e.func, e.line); |
| TTCN_Logger::end_event(); |
| return 0; |
| } |
| } |
| |
| return 0; |
| } |
| |
| }//namespace |