///////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2000-2019 Ericsson Telecom AB
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
///////////////////////////////////////////////////////////////////////////////
//
//  File:               STUN_Types.ttcn
//  Description:        STUN Protocol module
//  Rev:                <RnXnn>
//  Prodnr:             CNL 113 644
//  Updated:            2009-09-16
//  Contact:            http://ttcn.ericsson.se
//  Reference:          RFC 3489
///////////////////////////////////////////////
module STUN_Types {

external function f_STUN_Enc(in PDU_STUN pl_pdu, in octetstring pl_password := ''O) return octetstring;
external function f_STUN_Dec(in octetstring pl_oct) return PDU_STUN;
external function f_STUN_genTrasId() return octetstring;
external function f_STUN_genTrasId_withMagicCookie() return octetstring;
external function f_STUN_IP2oct(in charstring pl_ip) return octetstring;
external function f_STUN_oct2IP(in octetstring pl_ip) return charstring;
external function f_STUN_HMAC(in octetstring pl_string, in octetstring pl_key) return octetstring;
external function f_STUN_checkMessageIntegrity(in octetstring pl_msg, in octetstring pl_key) return boolean;
external function f_STUN_getMessageLength(in octetstring stream) return integer;

// STUN: RFC3489
type octetstring OCT4 length(4) with {
variant "FIELDLENGTH(4)"
}

type octetstring OCT1 length(1) with {
variant "FIELDLENGTH(1)"
}

type octetstring OCT2 length(2) with {
variant "FIELDLENGTH(2)"
}

type octetstring OCT16 length(16) with {
variant "FIELDLENGTH(16)"
}

type octetstring OCT20 length(20) with {
variant "FIELDLENGTH(20)"
}

type integer UINT16 (0..65535) with {
variant "FIELDLENGTH(16)"
variant "BYTEORDER(last)"
}

type OCT20 Attr_Oct160

type OCT4 Attr_Oct32

type OCT1 Attr_Oct8

type OCT2 Attr_Oct16

type enumerated STUN_Family 
{
  IP4 (1)
} with {
  variant "FIELDLENGTH(8)"
  variant "BYTEORDER(last)"
  variant "COMP(2scompl)"
}
//
// 11.2 STUN Message Attributes
//

// RFC 3489 11.2.1
// Attr: MAPPED-ADDRESS (1)
// RFC 3489 11.2.2
// Attr: RESPONSE-ADDRESS (2)
// RFC 3489 11.2.3
// Attr: CHANGED-ADDRESS (3)
// RFC 3489 11.2.5
// Attr: SOURCE-ADDRESS (5)
// RFC 3489 11.2.11
// Attr: REFLECTED-FROM (11)
type record Stun_Address 
{
  STUN_Family   family,
  UINT16	port_id,
  Attr_Oct32	ip_address
} with { variant (family) "FIELDLENGTH(16)"
  	 variant (family) "ALIGN(right)"
}


// RFC 3489 11.2.4
// Attr: CHANGE-REQUEST (4)
type enumerated Stun_Change_Request 
{
  NO_CHANGE   (0),
  CHANGE_PORT (2),
  CHANGE_IP   (4),
  CHANGE_BOTH (6)
} with {
  variant "FIELDLENGTH(32)"
  variant "BYTEORDER(last)"
  variant "COMP(2scompl)"
}

// RFC 3489 11.2.6
// Attr: USERNAME (6)
type charstring Stun_Username 
with { variant "PADDING(dword32)"}

// RFC 3489 11.2.7
// Attr: PASSWORD (7)
type octetstring Stun_Password 
with { variant "PADDING(dword32)"}

// RFC 3489 11.2.8
// Attr: MESSAGE-INTEGRITY (8)
type Attr_Oct160 Stun_Message_Integrity

// RFC 3489bis-13 14.7
// Attr: REALM (20)
type charstring Stun_Realm
with { variant "PADDING(dword32)"}

// RFC 3489bis-13 14.8
// Attr: NONCE (21)
type octetstring Stun_Nonce
with { variant "PADDING(dword32)"}

type enumerated Stun_Error_Code_Type
{
  BAD_REQUEST 		  (1024),
  UNAUTHORIZED		  (1025),
  UNKNOWN_ATTRIBUTE	  (1044),
  STALE_CREDENTIALS	  (1054),
  INTEGRITY_CHECK_FAILURE (1055),
  MISSING_USERNAME	  (1056),
  USE_TLS		  (1057),
  SERVER_ERROR		  (1280),
  GLOBAL_FAILURE	  (1536)
} with {
  variant "FIELDLENGTH(32)"
  variant "BYTEORDER(last)"
  variant "COMP(2scompl)"
}

// RFC 3489 11.2.9
// Attr: ERROR-CODE (9)
type record Stun_Error_Code {
  Stun_Error_Code_Type	error_code_tpye,
  charstring		reason_phrase
}
with { variant (reason_phrase) "PADDING(dword32)"}

type Attr_Oct16 STUN_Unknown_Attr_Data;

// RFC 3489 11.2.10
// Attr: UNKNOWN-ATTRIBUTES (10)
type set of STUN_Unknown_Attr_Data Stun_Unknown_Attributes
with { variant "PADDING(dword32)"}

type union STUN_Attr_data
{
  Stun_Address 			attr_Mapped_Address,
  Stun_Address			attr_Response_Address,
  Stun_Address			attr_Changed_Address,
  Stun_Change_Request		attr_Change_Request,
  Stun_Address			attr_Source_Address,
  Stun_Username			attr_Username,
  Stun_Password			attr_Password,
  Stun_Message_Integrity	attr_Message_Integrity,
  Stun_Error_Code		attr_Error_Code,
  Stun_Unknown_Attributes	attr_Unknown_Attributes,
  Stun_Address			attr_Reflected_From,
  Stun_Address                  attr_Xor_Mapped_Address,
  Stun_Realm                    attr_Realm,
  Stun_Nonce                    attr_Nonce
}

type enumerated STUN_Attr_type {
  MAPPED_ADDRESS      (1),
  RESPONSE_ADDRESS    (2),
  CHANGE_REQUEST      (3),
  SOURCE_ADDRESS      (4),
  CHANGED_ADDRESS     (5),
  USERNAME            (6),
  PASSWORD            (7),
  MESSAGE_INTEGRITY   (8),
  ERROR_CODE          (9),
  UNKNOWN_ATTRIBUTES (10),
  REFLECTED_FROM     (11),
  REALM              (20), //RFC 3489bis-13
  NONCE              (21), //RFC 3489bis-13
  XOR_MAPPED_ADDRESS (32)  //RFC 3489bis-13
} with {
  variant "FIELDLENGTH(16)"
  variant "BYTEORDER(last)"
  variant "COMP(2scompl)"
}

type record STUN_Attr {
  STUN_Attr_type	attr_type,
  UINT16		attr_length,
  STUN_Attr_data	attr_data 
} with {
  variant "PADDING(dword32)"
  variant (attr_length) "LENGTHTO(attr_data)"
  variant (attr_data) "CROSSTAG(
    attr_Mapped_Address, 	attr_type = MAPPED_ADDRESS;
    attr_Response_Address,	attr_type = RESPONSE_ADDRESS;
    attr_Changed_Address, 	attr_type = CHANGED_ADDRESS;
    attr_Change_Request,	attr_type = CHANGE_REQUEST;
    attr_Source_Address,	attr_type = SOURCE_ADDRESS;
    attr_Username,		attr_type = USERNAME;
    attr_Password,		attr_type = PASSWORD;
    attr_Message_Integrity,	attr_type = MESSAGE_INTEGRITY;
    attr_Error_Code,		attr_type = ERROR_CODE;
    attr_Unknown_Attributes,	attr_type = UNKNOWN_ATTRIBUTES;
    attr_Reflected_From,        attr_type = REFLECTED_FROM
  )"
}

type set of STUN_Attr Attr_List

type enumerated STUN_Msg_Type {
 Binding_Request                (1),
 Binding_Response             (257),
 Binding_Error_Response       (273),
 Shared_Secret_Request          (2),
 Shared_Secret_Response       (258),
 Shared_Secret_Error_Response (274)
} with {
  variant "FIELDLENGTH(16)"
  variant "BYTEORDER(last)"
  variant "COMP(2scompl)"
}

type record STUN_Header {
  STUN_Msg_Type   msg_type,
  UINT16	  msg_length,
  OCT16		  trans_id
}

type record PDU_STUN {
 	 STUN_Header 	header,
 	 Attr_List	attr_list
} with {
  variant "PADDING(dword32)"
  variant (header) "LENGTHTO(attr_list)"
  variant (header) "LENGTHINDEX(msg_length)"
}
 
} with { encode "RAW" } // End module
