From 9b48221e26a9b5f81a12d0de04bc3eaa8f749d11 Mon Sep 17 00:00:00 2001
From: erititan <elemer.lelik@ericsson.com>
Date: Sat, 1 Aug 2015 09:30:26 +0200
Subject: [PATCH] Initial contribution

---
 README.md                        |   9 +
 WebSocket_CNL113782.tpd          |  43 +++++
 doc/WebSocket_CNL113782_1551.doc | Bin 0 -> 71168 bytes
 doc/WebSocket_CNL113782_PRI.doc  | Bin 0 -> 56832 bytes
 src/WebSocket_CNL113782.grp      |  19 ++
 src/WebSocket_EncDec.cc          | 300 +++++++++++++++++++++++++++++++
 src/WebSocket_Types.ttcn         |  73 ++++++++
 7 files changed, 444 insertions(+)
 create mode 100644 README.md
 create mode 100644 WebSocket_CNL113782.tpd
 create mode 100644 doc/WebSocket_CNL113782_1551.doc
 create mode 100644 doc/WebSocket_CNL113782_PRI.doc
 create mode 100644 src/WebSocket_CNL113782.grp
 create mode 100644 src/WebSocket_EncDec.cc
 create mode 100644 src/WebSocket_Types.ttcn

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d81e3e7
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+# titan.ProtocolModules.WebSocket
+
+Main project page:
+
+https://projects.eclipse.org/projects/tools.titan
+
+The source code of the TTCN-3 compiler and executor:
+
+https://github.com/eclipse/titan.core
diff --git a/WebSocket_CNL113782.tpd b/WebSocket_CNL113782.tpd
new file mode 100644
index 0000000..59ec59d
--- /dev/null
+++ b/WebSocket_CNL113782.tpd
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2015 Ericsson
+
+  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:               WebSocket_CNL113782.tpd
+   Description:        tpd project file
+   Rev:                R2A
+   Prodnr:             CNL 113 782
+
+ -->
+<TITAN_Project_File_Information version="1.0">
+  <ProjectName>WebSocket_CNL113782</ProjectName>
+  <Files>
+    <FileResource projectRelativePath="WebSocket_EncDec.cc" relativeURI="src/WebSocket_EncDec.cc"/>
+    <FileResource projectRelativePath="WebSocket_Types.ttcn" relativeURI="src/WebSocket_Types.ttcn"/>
+  </Files>
+  <ActiveConfiguration>Default</ActiveConfiguration>
+  <Configurations>
+    <Configuration name="Default">
+      <ProjectProperties>
+        <MakefileSettings>
+          <generateInternalMakefile>true</generateInternalMakefile>
+          <GNUMake>true</GNUMake>
+          <incrementalDependencyRefresh>true</incrementalDependencyRefresh>
+          <targetExecutable>bin/WebSocket_CNL113782</targetExecutable>
+        </MakefileSettings>
+        <LocalBuildSettings>
+          <workingDirectory>bin</workingDirectory>
+        </LocalBuildSettings>
+        <NamingCoventions>
+          <enableProjectSpecificSettings>true</enableProjectSpecificSettings>
+          <externalFunction>f_.*</externalFunction>
+        </NamingCoventions>
+      </ProjectProperties>
+    </Configuration>
+  </Configurations>
+</TITAN_Project_File_Information>
diff --git a/doc/WebSocket_CNL113782_1551.doc b/doc/WebSocket_CNL113782_1551.doc
new file mode 100644
index 0000000000000000000000000000000000000000..76145e1f40bc7add8812e53dfeea3b046d44a1ec
GIT binary patch
literal 71168
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

literal 0
HcmV?d00001

diff --git a/doc/WebSocket_CNL113782_PRI.doc b/doc/WebSocket_CNL113782_PRI.doc
new file mode 100644
index 0000000000000000000000000000000000000000..46dc020acaeaacf7f5f48bf04ed48dbfe1073412
GIT binary patch
literal 56832
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
O{RL^Ou>aF2@c#gzZn)|I

literal 0
HcmV?d00001

diff --git a/src/WebSocket_CNL113782.grp b/src/WebSocket_CNL113782.grp
new file mode 100644
index 0000000..94597da
--- /dev/null
+++ b/src/WebSocket_CNL113782.grp
@@ -0,0 +1,19 @@
+<!--
+/******************************************************************************
+* Copyright (c) 2005, 2015  Ericsson 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
+*
+* Contributors:
+* Gabor Szalai
+******************************************************************************/
+-->
+<!DOCTYPE TITAN_GUI_FileGroup_file>
+<FileGroup TITAN_version="3.1.pl0" >
+    <File_Group name="WebSocket_CNL113782" >
+        <File path="WebSocket_EncDec.cc" />
+        <File path="WebSocket_Types.ttcn" />
+    </File_Group>
+</FileGroup>
diff --git a/src/WebSocket_EncDec.cc b/src/WebSocket_EncDec.cc
new file mode 100644
index 0000000..a329fcf
--- /dev/null
+++ b/src/WebSocket_EncDec.cc
@@ -0,0 +1,300 @@
+/******************************************************************************
+* Copyright (c) 2005, 2015  Ericsson 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
+*
+* Contributors:
+* Gabor Szalai
+******************************************************************************/
+//
+//  File:               WebSocket_EncDec.cc
+//  Prodnr:             CNL 113 782
+//  Rev:                R2A
+
+
+#include "WebSocket_Types.hh"
+#include <stdlib.h>
+#include <time.h>
+#include <sys/types.h>
+
+static const unsigned char zero_data[]={0,0,0,0};
+static const OCTETSTRING zero_oct=OCTETSTRING(4,&zero_data[0]);
+
+
+namespace WebSocket__Types {
+
+void do_mask(const unsigned char* key, const unsigned char* source, 
+             unsigned char* target, size_t size){
+  int key_idx=0;
+  for(size_t i=0;i<size;i++){
+    target[i]=source[i]^key[key_idx];
+    key_idx++;
+    key_idx&=0x3;
+  }
+}
+
+void f__WebSocket__Encode(const WebSocket__PDU& pl__pdu, OCTETSTRING& pl__data,
+                   const BOOLEAN& pl__gen__maks, const BOOLEAN& pl__auto__maks){
+  TTCN_Buffer buff;
+  unsigned char* data_ptr=NULL;
+  size_t payload_size=0;
+  if(pl__pdu.payload__data().ispresent()){
+    if(pl__pdu.payload__data()().ischosen(WebSocket__payloads::ALT_data)){
+      payload_size=pl__pdu.payload__data()().data().lengthof();
+    } else {
+      payload_size=2;
+      if(pl__pdu.payload__data()().close__data().data().ispresent()){
+        payload_size+=pl__pdu.payload__data()().close__data().data()().lengthof();
+      }
+    }
+  }
+  size_t data_size=14+payload_size; // max header size + payload size
+  
+  buff.get_end(data_ptr,data_size);
+  unsigned char* begin_ptr=data_ptr;
+  memset(data_ptr,0,data_size);
+
+  *data_ptr|=((*((const unsigned char*)pl__pdu.fin__bit()))&0x1)<<7;
+  *data_ptr|=((*((const unsigned char*)pl__pdu.rsv1__bit()))&0x1)<<6;
+  *data_ptr|=((*((const unsigned char*)pl__pdu.rsv2__bit()))&0x1)<<5;
+  *data_ptr|=((*((const unsigned char*)pl__pdu.rsv3__bit()))&0x1)<<4;
+  *data_ptr|=((int)pl__pdu.opcode())&0xf;
+  data_ptr++;
+
+  *data_ptr|=((*((const unsigned char*)pl__pdu.mask__bit()))&0x1)<<7;
+
+  // encode size
+  if(payload_size<126){
+    *data_ptr|=(payload_size&0x7);
+    data_ptr++;
+  } else if (payload_size<65536) { // 16 bit unsigned max
+    size_t orig_p_size=payload_size; 
+    *data_ptr|=126;
+    data_ptr++;
+    data_ptr[1]=orig_p_size&0xff;
+    orig_p_size>>=8;
+    data_ptr[0]=orig_p_size&0xff;
+    data_ptr+=2;
+  } else {
+    size_t orig_p_size=payload_size; 
+    *data_ptr|=127;
+    data_ptr++;
+    data_ptr[7]=orig_p_size&0xff;
+    orig_p_size>>=8;
+    data_ptr[6]=orig_p_size&0xff;
+    orig_p_size>>=8;
+    data_ptr[5]=orig_p_size&0xff;
+    orig_p_size>>=8;
+    data_ptr[4]=orig_p_size&0xff;
+    orig_p_size>>=8;
+    data_ptr[3]=orig_p_size&0xff;
+    orig_p_size>>=8;
+    data_ptr[2]=orig_p_size&0xff;
+    orig_p_size>>=8;
+    data_ptr[1]=orig_p_size&0xff;
+    orig_p_size>>=8;
+    data_ptr[0]=orig_p_size&0xff;
+    data_ptr+=8;
+  }
+  
+  unsigned char* mask_ptr=NULL;
+  if(((*((const unsigned char*)pl__pdu.mask__bit()))&0x1) &&
+      pl__gen__maks &&
+      (!pl__pdu.masking__key().ispresent() || 
+                                           pl__pdu.masking__key()()==zero_oct)){
+    // generate masking key
+    mask_ptr=data_ptr;
+    OCTETSTRING mk=f__WebSocket__Generate__Masking__Key();
+    memcpy(data_ptr,(const unsigned char *)mk,4);
+    data_ptr+=4;
+  } else if(pl__pdu.masking__key().ispresent()) { // use the provided key
+    mask_ptr=data_ptr;
+    memcpy(data_ptr,(const unsigned char *)pl__pdu.masking__key()(),4);
+    data_ptr+=4;
+  }
+  
+  if(pl__pdu.payload__data().ispresent()){
+    if(pl__pdu.payload__data()().ischosen(WebSocket__payloads::ALT_data)){
+      memcpy(data_ptr,
+             (const unsigned char *)pl__pdu.payload__data()().data(),
+             pl__pdu.payload__data()().data().lengthof());
+    } else {
+      int st_code=(int)pl__pdu.payload__data()().close__data().status__code();
+      data_ptr[1]=st_code&0xFF;
+      st_code>>=8;
+      data_ptr[0]=st_code&0xFF;
+      if(pl__pdu.payload__data()().close__data().data().ispresent()){
+        memcpy(data_ptr+2, // skip status code
+        (const unsigned char *)pl__pdu.payload__data()().close__data().data()(),
+             pl__pdu.payload__data()().close__data().data()().lengthof());
+      }
+    }
+  }
+  
+  if(mask_ptr && pl__auto__maks){ // apply mask
+    do_mask(mask_ptr,data_ptr,data_ptr,payload_size);
+  }
+  
+  buff.increase_length(data_ptr-begin_ptr+payload_size);
+  buff.get_string(pl__data);
+  
+}
+
+INTEGER f__WebSocket__Decode(const OCTETSTRING& pl__data, 
+                        WebSocket__PDU& pl__pdu, const BOOLEAN& pl__auto__maks){
+  size_t data_len=pl__data.lengthof();
+  if(data_len>=2){
+    const unsigned char* data_ptr=(const unsigned char*)pl__data;
+    size_t base_length=(data_ptr[1]&0x80)?6:2;
+    size_t payload_length=data_ptr[1]&0x7F;
+    size_t len_len=0;
+    if (payload_length==126) {
+      if(data_len>=4){
+        payload_length=(data_ptr[2]<<8)+data_ptr[3];
+        len_len=2;
+      } else {
+        return 1; // NOT_MY_TYPE not enough bits in the buffer
+      }
+    } else if (payload_length==127) {
+      if(data_len>=10){
+        len_len=8;
+        long long int large_payload_length=(((long long int)data_ptr[2])<<56)+
+          (((long long int)data_ptr[3])<<48)+(((long long int)data_ptr[4])<<40)+
+          (((long long int)data_ptr[5])<<32)+(((long long int)data_ptr[6])<<24)+
+          (((long long int)data_ptr[7])<<16)+(((long long int)data_ptr[8])<<8)+
+          (long long int)data_ptr[9];
+        payload_length=large_payload_length;
+        if(large_payload_length!=(long long int)payload_length){ // overflow
+          TTCN_warning("The received WebSocket messages is too large");
+          return 1; // NOT_MY_TYPE message too largo to handle
+        }
+      } else {
+        return 1; // NOT_MY_TYPE not enough bits in the buffer
+      }
+    }
+    
+    if(data_len<(payload_length+base_length)){
+      return 1; // NOT_MY_TYPE not enough bits in the buffer
+    }
+    
+    // Now the decodeing can be started.
+    unsigned char bit_temp;
+    
+    bit_temp=(data_ptr[0]>>7)&0x1;
+    pl__pdu.fin__bit()=BITSTRING(1,&bit_temp);
+    bit_temp=(data_ptr[0]>>6)&0x1;
+    pl__pdu.rsv1__bit()=BITSTRING(1,&bit_temp);
+    bit_temp=(data_ptr[0]>>5)&0x1;
+    pl__pdu.rsv2__bit()=BITSTRING(1,&bit_temp);
+    bit_temp=(data_ptr[0]>>4)&0x1;
+    pl__pdu.rsv3__bit()=BITSTRING(1,&bit_temp);
+    
+    pl__pdu.opcode()=data_ptr[0]&0xf;
+    
+    bit_temp=(data_ptr[1]>>7)&0x1;
+    bool masked=bit_temp;
+    pl__pdu.mask__bit()=BITSTRING(1,&bit_temp);
+    pl__pdu.payload__len()=payload_length;
+    
+    data_ptr+=len_len+2;
+    
+    unsigned char* unmasked=NULL;
+    if(masked){
+      pl__pdu.masking__key()=OCTETSTRING(4,data_ptr);
+      if(pl__auto__maks && payload_length){
+        unmasked=(unsigned char*)Malloc(payload_length*sizeof(unsigned char));
+        do_mask(data_ptr,data_ptr+4,unmasked,payload_length);
+        data_ptr=unmasked;
+      } else {
+        data_ptr+=4;
+      }
+    } else {
+      pl__pdu.masking__key()=OMIT_VALUE;
+    }
+    
+    if(payload_length){
+      if(pl__pdu.opcode()==WebSocket__opcode::Connection__Close){
+        if(payload_length>=2){
+          pl__pdu.payload__data()().close__data().status__code()= 
+                                                 (data_ptr[0]<<8) + data_ptr[1];
+          if(payload_length>2){
+            pl__pdu.payload__data()().close__data().data()()=
+                                       OCTETSTRING(payload_length-2,data_ptr+2);
+          } else {
+            pl__pdu.payload__data()().close__data().data()=OMIT_VALUE;
+          }
+        } else {
+          return 1; // NOT_MY_TYPE not enough bits in the buffer
+        }
+      } else {
+        pl__pdu.payload__data()().data()=OCTETSTRING(payload_length,data_ptr);
+      }
+      
+    } else {
+      pl__pdu.payload__data()=OMIT_VALUE;
+    }
+    
+    if(unmasked) {
+      Free(unmasked);
+    }
+    
+  } else {
+    return 1; // NOT_MY_TYPE not enough bits in the buffer
+  }
+  return 0;
+}
+
+INTEGER f__WebSocket__calc__length(const OCTETSTRING& pl__data){
+  size_t data_len=pl__data.lengthof();
+  if(data_len>=2){
+    const unsigned char* data_ptr=(const unsigned char*)pl__data;
+    int base_length=(data_ptr[1]&0x80)?6:2;
+    int payload_length=data_ptr[1]&0x7F;
+    if(payload_length<126){
+      return payload_length+base_length;
+    } else if (payload_length==126) {
+      if(data_len>=4){
+        payload_length=(data_ptr[2]<<8)+data_ptr[3];
+        return payload_length+base_length+2;
+      }
+    } else {
+      if(data_len>=10){
+        long long int large_payload_length=(((long long int)data_ptr[2])<<56)+
+          (((long long int)data_ptr[3])<<48)+(((long long int)data_ptr[4])<<40)+
+          (((long long int)data_ptr[5])<<32)+(((long long int)data_ptr[6])<<24)+
+          (((long long int)data_ptr[7])<<16)+(((long long int)data_ptr[8])<<8)+
+          (long long int)data_ptr[9]+(long long int)base_length+8;
+        INTEGER large_ret_val;
+        large_ret_val.set_long_long_val(large_payload_length);
+        return large_ret_val;
+      }
+    }
+  }
+  return -1;
+}
+
+OCTETSTRING f__WebSocket__Generate__Masking__Key(){
+  static bool inited=false;
+  if(!inited){
+    time_t t1;
+    time(&t1);
+	  srand48((long) t1);
+    inited=true;
+  }
+  unsigned char mkey[4];
+  long int key=mrand48();
+  mkey[0]= key & 0xFF;
+  key>>=8;
+  mkey[1]= key & 0xFF;
+  key>>=8;
+  mkey[2]= key & 0xFF;
+  key>>=8;
+  mkey[3]= key & 0xFF;
+  return OCTETSTRING(4,&mkey[0]);
+}
+
+
+}
+
diff --git a/src/WebSocket_Types.ttcn b/src/WebSocket_Types.ttcn
new file mode 100644
index 0000000..04caf74
--- /dev/null
+++ b/src/WebSocket_Types.ttcn
@@ -0,0 +1,73 @@
+/******************************************************************************
+* Copyright (c) 2005, 2015  Ericsson 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
+*
+* Contributors:
+* Gabor Szalai
+******************************************************************************/
+//
+//  File:               WebSocket_Types.ttcn
+//  Rev:                R2A
+//  Prodnr:             CNL 113 782
+//  Reference:          RFC 6455
+
+module WebSocket_Types {
+
+  modulepar boolean m_Websocket_generate_masking_key:=true;
+  modulepar boolean m_Websocket_auto_masking:=true;
+
+  external function f_WebSocket_Encode(in WebSocket_PDU pl_pdu,
+                       out octetstring pl_data,
+                       in boolean pl_gen_maks:=m_Websocket_generate_masking_key,
+                       in boolean pl_auto_maks:= m_Websocket_auto_masking);
+
+  external function f_WebSocket_Decode(in octetstring pl_data,
+                       out WebSocket_PDU pl_pdu,
+                       in boolean pl_auto_maks:= m_Websocket_auto_masking) 
+                       return integer;
+
+  external function f_WebSocket_calc_length(in octetstring pl_data)
+                       return integer;
+
+  external function f_WebSocket_Generate_Masking_Key() return octetstring;
+
+  type record Websocket_close {
+    integer           status_code,
+    octetstring       data optional
+  };
+
+  type enumerated WebSocket_opcode {Continuation_frame (0), Text_frame (1),
+                                    Binary_frame (2), Reserved_non_control3 (3),
+                                    Reserved_non_control4 (4),
+                                    Reserved_non_control5 (5),
+                                    Reserved_non_control6 (6),
+                                    Reserved_non_control7 (7),
+                                    Connection_Close(8), Ping(9), Pong (10),
+                                    Reserved_control11 (11),
+                                    Reserved_control12 (12),
+                                    Reserved_control13 (13),
+                                    Reserved_control14 (14),
+                                    Reserved_control15 (15)
+                                  };
+
+  type union WebSocket_payloads {
+    octetstring       data,
+    Websocket_close   close_data
+  };
+  
+  type record WebSocket_PDU {
+    bitstring           fin_bit length(1),
+    bitstring           rsv1_bit length(1),
+    bitstring           rsv2_bit length(1),
+    bitstring           rsv3_bit length(1),
+    WebSocket_opcode    opcode,
+    bitstring           mask_bit length(1),
+    integer             payload_len,
+    octetstring         masking_key length(4) optional,
+    WebSocket_payloads  payload_data optional
+  };
+
+}
-- 
GitLab