Browse Source

Merge branch 'master' into inline_setattribute

Julius Pfrommer 9 years ago
parent
commit
acb8494b22

+ 2 - 1
.travis.yml

@@ -31,7 +31,8 @@ script:
 - "if [ ${TRAVIS_OS_NAME} == 'linux' ]; then . ./tools/travis_linux_script.sh; fi"
 - "if [ ${TRAVIS_OS_NAME} == 'osx' ]; then . ./tools/travis_osx_script.sh; fi"
 after_success:
-- if [[ ( ${TRAVIS_OS_NAME} == "linux" && ${CC} == "gcc" && ${TRAVIS_BRANCH} == "master") ]]; then ./tools/.deployGH.sh; fi
+- if [[ ( ${TRAVIS_OS_NAME} == "linux" && ${CC} == "gcc" && ${TRAVIS_BRANCH} == "master") ]]; then ./tools/.deployGH_doc.sh; fi
+- if [[ ( ${TRAVIS_OS_NAME} == "linux" && ${CC} == "gcc" ) ]]; then ./tools/.deployGH_release.sh; fi
 - if [[ ( ${TRAVIS_OS_NAME} == "linux" && ${CC} == "gcc" && ${TRAVIS_BRANCH} == "master") ]]; then ./tools/.coverity.sh; fi
 before_deploy:
 - rm build -rf && mkdir -p build && cd build

+ 14 - 6
CMakeLists.txt

@@ -133,6 +133,14 @@ set(lib_sources ${PROJECT_SOURCE_DIR}/src/ua_types.c
 ## generate code from xml definitions
 file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/src_generated")
 
+option(ENABLE_TYPEINTROSPECTION "Add the type and member names to the internal structures" OFF)
+mark_as_advanced(ENABLE_TYPEINTROSPECTION)
+if(ENABLE_TYPEINTROSPECTION)
+  set(generate_typeintrospection "--typeintrospection")
+else()
+  set(generate_typeintrospection "")
+endif()
+
 option(ENABLE_SUBSCRIPTIONS "Enable compilation of subscription and monitoring support." OFF)
 if(ENABLE_SUBSCRIPTIONS)
   set(ENABLE_SUBSCRIPTIONS ON) #to propagate it to the config file
@@ -148,7 +156,7 @@ if(ENABLE_SUBSCRIPTIONS)
                             ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated.h
                             ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated_encoding_binary.h
                      PRE_BUILD
-                     COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py --enable-subscription-types=1 --typedescriptions ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv 0 ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd ${PROJECT_BINARY_DIR}/src_generated/ua_types
+                     COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py --enable-subscription-types=1 ${generate_typeintrospection} --typedescriptions ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv 0 ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd ${PROJECT_BINARY_DIR}/src_generated/ua_types
                      DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_datatypes.py
                              ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd
                              ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/NodeIds.csv)
@@ -157,7 +165,7 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated
                           ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated.h
                           ${PROJECT_BINARY_DIR}/src_generated/ua_types_generated_encoding_binary.h
                    PRE_BUILD
-                   COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py --typedescriptions ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv 0 ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd ${PROJECT_BINARY_DIR}/src_generated/ua_types
+                   COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py ${generate_typeintrospection} --typedescriptions ${PROJECT_SOURCE_DIR}/tools/schema/NodeIds.csv 0 ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd ${PROJECT_BINARY_DIR}/src_generated/ua_types
                    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_datatypes.py
                            ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd
                            ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/NodeIds.csv)
@@ -167,7 +175,7 @@ add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src_generated/ua_transport_gener
                           ${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated.h
                           ${PROJECT_BINARY_DIR}/src_generated/ua_transport_generated_encoding_binary.h
                    PRE_BUILD
-                   COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py --ns0-types-xml ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd 1 ${PROJECT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd ${PROJECT_BINARY_DIR}/src_generated/ua_transport
+                   COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/tools/generate_datatypes.py ${generate_typeintrospection} --ns0-types-xml ${PROJECT_SOURCE_DIR}/tools/schema/Opc.Ua.Types.bsd 1 ${PROJECT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd ${PROJECT_BINARY_DIR}/src_generated/ua_transport
                    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_datatypes.py
                            ${CMAKE_CURRENT_SOURCE_DIR}/tools/schema/Custom.Opc.Ua.Transport.bsd)
 
@@ -246,8 +254,8 @@ if(EXTENSION_UDP)
   endif()
 endif()
 
-option(LEGACY "Enable LEGACY code" OFF)
-mark_as_advanced(LEGACY)
+option(ENABLE_LEGACY "Enable LEGACY code" OFF)
+mark_as_advanced(ENABLE_LEGACY)
 
 option(EXTENSION_STATELESS "Enable stateless extension" OFF)
 if(EXTENSION_STATELESS)
@@ -369,7 +377,7 @@ if(BUILD_EXAMPLECLIENT)
             target_link_libraries(client_stateless urcu-cds urcu urcu-common pthread)
         endif()
     endif()
-    if(LEGACY AND NOT ENABLE_AMALGAMATION)
+    if(ENABLE_LEGACY AND NOT ENABLE_AMALGAMATION)
     	add_executable(client_legacy ${PROJECT_SOURCE_DIR}/examples/client_legacy.c $<TARGET_OBJECTS:open62541-object>)
 		target_link_libraries(client_legacy ${LIBS})
 	endif()

+ 0 - 822
deps/tweetnacl.c

@@ -1,822 +0,0 @@
- /*
-  * http://tweetnacl.cr.yp.to/
-  * TweetNaCl was put in the public domain by the authors Bernstein et al.
-  * The API is th same as for NaCl (http://nacl.cr.yp.to/).
-  */
-
-#include "tweetnacl.h"
-#define FOR(i,n) for (i = 0;i < n;++i)
-#define sv static void
-
-/* Manual change from TweetNaCl version 20140427: Use C99 integer types
-typedef unsigned char u8;
-typedef unsigned long u32;
-typedef unsigned long long u64;
-typedef long long i64; */
-#include <inttypes.h>
-typedef uint8_t u8;
-typedef uint32_t u32;
-typedef uint64_t u64;
-typedef int64_t i64;
-/* end manual change */
-typedef i64 gf[16];
-extern void randombytes(u8 *,u64);
-
-static const u8
-  _0[16],
-  _9[32] = {9};
-static const gf
-  gf0,
-  gf1 = {1},
-  _121665 = {0xDB41,1},
-  D = {0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203},
-  D2 = {0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406},
-  X = {0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169},
-  Y = {0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666},
-  I = {0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83};
-
-static u32 L32(u32 x,int c) { return (x << c) | ((x&0xffffffff) >> (32 - c)); }
-
-static u32 ld32(const u8 *x)
-{
-  u32 u = x[3];
-  u = (u<<8)|x[2];
-  u = (u<<8)|x[1];
-  return (u<<8)|x[0];
-}
-
-static u64 dl64(const u8 *x)
-{
-  u64 i,u=0;
-  FOR(i,8) u=(u<<8)|x[i];
-  return u;
-}
-
-sv st32(u8 *x,u32 u)
-{
-  int i;
-  FOR(i,4) { x[i] = u; u >>= 8; }
-}
-
-sv ts64(u8 *x,u64 u)
-{
-  int i;
-  for (i = 7;i >= 0;--i) { x[i] = u; u >>= 8; }
-}
-
-static int vn(const u8 *x,const u8 *y,int n)
-{
-  u32 i,d = 0;
-  FOR(i,n) d |= x[i]^y[i];
-  return (1 & ((d - 1) >> 8)) - 1;
-}
-
-int crypto_verify_16(const u8 *x,const u8 *y)
-{
-  return vn(x,y,16);
-}
-
-int crypto_verify_32(const u8 *x,const u8 *y)
-{
-  return vn(x,y,32);
-}
-
-sv core(u8 *out,const u8 *in,const u8 *k,const u8 *c,int h)
-{
-  u32 w[16],x[16],y[16],t[4];
-  int i,j,m;
-
-  FOR(i,4) {
-    x[5*i] = ld32(c+4*i);
-    x[1+i] = ld32(k+4*i);
-    x[6+i] = ld32(in+4*i);
-    x[11+i] = ld32(k+16+4*i);
-  }
-
-  FOR(i,16) y[i] = x[i];
-
-  FOR(i,20) {
-    FOR(j,4) {
-      FOR(m,4) t[m] = x[(5*j+4*m)%16];
-      t[1] ^= L32(t[0]+t[3], 7);
-      t[2] ^= L32(t[1]+t[0], 9);
-      t[3] ^= L32(t[2]+t[1],13);
-      t[0] ^= L32(t[3]+t[2],18);
-      FOR(m,4) w[4*j+(j+m)%4] = t[m];
-    }
-    FOR(m,16) x[m] = w[m];
-  }
-
-  if (h) {
-    FOR(i,16) x[i] += y[i];
-    FOR(i,4) {
-      x[5*i] -= ld32(c+4*i);
-      x[6+i] -= ld32(in+4*i);
-    }
-    FOR(i,4) {
-      st32(out+4*i,x[5*i]);
-      st32(out+16+4*i,x[6+i]);
-    }
-  } else
-    FOR(i,16) st32(out + 4 * i,x[i] + y[i]);
-}
-
-int crypto_core_salsa20(u8 *out,const u8 *in,const u8 *k,const u8 *c)
-{
-  core(out,in,k,c,0);
-  return 0;
-}
-
-int crypto_core_hsalsa20(u8 *out,const u8 *in,const u8 *k,const u8 *c)
-{
-  core(out,in,k,c,1);
-  return 0;
-}
-
-static const u8 sigma[16] = "expand 32-byte k";
-
-int crypto_stream_salsa20_xor(u8 *c,const u8 *m,u64 b,const u8 *n,const u8 *k)
-{
-  u8 z[16],x[64];
-  u32 u,i;
-  if (!b) return 0;
-  FOR(i,16) z[i] = 0;
-  FOR(i,8) z[i] = n[i];
-  while (b >= 64) {
-    crypto_core_salsa20(x,z,k,sigma);
-    FOR(i,64) c[i] = (m?m[i]:0) ^ x[i];
-    u = 1;
-    for (i = 8;i < 16;++i) {
-      u += (u32) z[i];
-      z[i] = u;
-      u >>= 8;
-    }
-    b -= 64;
-    c += 64;
-    if (m) m += 64;
-  }
-  if (b) {
-    crypto_core_salsa20(x,z,k,sigma);
-    FOR(i,b) c[i] = (m?m[i]:0) ^ x[i];
-  }
-  return 0;
-}
-
-int crypto_stream_salsa20(u8 *c,u64 d,const u8 *n,const u8 *k)
-{
-  return crypto_stream_salsa20_xor(c,0,d,n,k);
-}
-
-int crypto_stream(u8 *c,u64 d,const u8 *n,const u8 *k)
-{
-  u8 s[32];
-  crypto_core_hsalsa20(s,n,k,sigma);
-  return crypto_stream_salsa20(c,d,n+16,s);
-}
-
-int crypto_stream_xor(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *k)
-{
-  u8 s[32];
-  crypto_core_hsalsa20(s,n,k,sigma);
-  return crypto_stream_salsa20_xor(c,m,d,n+16,s);
-}
-
-sv add1305(u32 *h,const u32 *c)
-{
-  u32 j,u = 0;
-  FOR(j,17) {
-    u += h[j] + c[j];
-    h[j] = u & 255;
-    u >>= 8;
-  }
-}
-
-static const u32 minusp[17] = {
-  5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252
-} ;
-
-int crypto_onetimeauth(u8 *out,const u8 *m,u64 n,const u8 *k)
-{
-  u32 s,i,j,u,x[17],r[17],h[17],c[17],g[17];
-
-  FOR(j,17) r[j]=h[j]=0;
-  FOR(j,16) r[j]=k[j];
-  r[3]&=15;
-  r[4]&=252;
-  r[7]&=15;
-  r[8]&=252;
-  r[11]&=15;
-  r[12]&=252;
-  r[15]&=15;
-
-  while (n > 0) {
-    FOR(j,17) c[j] = 0;
-    for (j = 0;(j < 16) && (j < n);++j) c[j] = m[j];
-    c[j] = 1;
-    m += j; n -= j;
-    add1305(h,c);
-    FOR(i,17) {
-      x[i] = 0;
-      FOR(j,17) x[i] += h[j] * ((j <= i) ? r[i - j] : 320 * r[i + 17 - j]);
-    }
-    FOR(i,17) h[i] = x[i];
-    u = 0;
-    FOR(j,16) {
-      u += h[j];
-      h[j] = u & 255;
-      u >>= 8;
-    }
-    u += h[16]; h[16] = u & 3;
-    u = 5 * (u >> 2);
-    FOR(j,16) {
-      u += h[j];
-      h[j] = u & 255;
-      u >>= 8;
-    }
-    u += h[16]; h[16] = u;
-  }
-
-  FOR(j,17) g[j] = h[j];
-  add1305(h,minusp);
-  s = -(h[16] >> 7);
-  FOR(j,17) h[j] ^= s & (g[j] ^ h[j]);
-
-  FOR(j,16) c[j] = k[j + 16];
-  c[16] = 0;
-  add1305(h,c);
-  FOR(j,16) out[j] = h[j];
-  return 0;
-}
-
-int crypto_onetimeauth_verify(const u8 *h,const u8 *m,u64 n,const u8 *k)
-{
-  u8 x[16];
-  crypto_onetimeauth(x,m,n,k);
-  return crypto_verify_16(h,x);
-}
-
-int crypto_secretbox(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *k)
-{
-  int i;
-  if (d < 32) return -1;
-  crypto_stream_xor(c,m,d,n,k);
-  crypto_onetimeauth(c + 16,c + 32,d - 32,c);
-  FOR(i,16) c[i] = 0;
-  return 0;
-}
-
-int crypto_secretbox_open(u8 *m,const u8 *c,u64 d,const u8 *n,const u8 *k)
-{
-  int i;
-  u8 x[32];
-  if (d < 32) return -1;
-  crypto_stream(x,32,n,k);
-  if (crypto_onetimeauth_verify(c + 16,c + 32,d - 32,x) != 0) return -1;
-  crypto_stream_xor(m,c,d,n,k);
-  FOR(i,32) m[i] = 0;
-  return 0;
-}
-
-sv set25519(gf r, const gf a)
-{
-  int i;
-  FOR(i,16) r[i]=a[i];
-}
-
-sv car25519(gf o)
-{
-  int i;
-  i64 c;
-  FOR(i,16) {
-    o[i]+=(1LL<<16);
-    c=o[i]>>16;
-    o[(i+1)*(i<15)]+=c-1+37*(c-1)*(i==15);
-    o[i]-=c<<16;
-  }
-}
-
-sv sel25519(gf p,gf q,int b)
-{
-  i64 t,i,c=~(b-1);
-  FOR(i,16) {
-    t= c&(p[i]^q[i]);
-    p[i]^=t;
-    q[i]^=t;
-  }
-}
-
-sv pack25519(u8 *o,const gf n)
-{
-  int i,j,b;
-  gf m,t;
-  FOR(i,16) t[i]=n[i];
-  car25519(t);
-  car25519(t);
-  car25519(t);
-  FOR(j,2) {
-    m[0]=t[0]-0xffed;
-    for(i=1;i<15;i++) {
-      m[i]=t[i]-0xffff-((m[i-1]>>16)&1);
-      m[i-1]&=0xffff;
-    }
-    m[15]=t[15]-0x7fff-((m[14]>>16)&1);
-    b=(m[15]>>16)&1;
-    m[14]&=0xffff;
-    sel25519(t,m,1-b);
-  }
-  FOR(i,16) {
-    o[2*i]=t[i]&0xff;
-    o[2*i+1]=t[i]>>8;
-  }
-}
-
-static int neq25519(const gf a, const gf b)
-{
-  u8 c[32],d[32];
-  pack25519(c,a);
-  pack25519(d,b);
-  return crypto_verify_32(c,d);
-}
-
-static u8 par25519(const gf a)
-{
-  u8 d[32];
-  pack25519(d,a);
-  return d[0]&1;
-}
-
-sv unpack25519(gf o, const u8 *n)
-{
-  int i;
-  FOR(i,16) o[i]=n[2*i]+((i64)n[2*i+1]<<8);
-  o[15]&=0x7fff;
-}
-
-sv A(gf o,const gf a,const gf b)
-{
-  int i;
-  FOR(i,16) o[i]=a[i]+b[i];
-}
-
-sv Z(gf o,const gf a,const gf b)
-{
-  int i;
-  FOR(i,16) o[i]=a[i]-b[i];
-}
-
-sv M(gf o,const gf a,const gf b)
-{
-  i64 i,j,t[31];
-  FOR(i,31) t[i]=0;
-  FOR(i,16) FOR(j,16) t[i+j]+=a[i]*b[j];
-  FOR(i,15) t[i]+=38*t[i+16];
-  FOR(i,16) o[i]=t[i];
-  car25519(o);
-  car25519(o);
-}
-
-sv S(gf o,const gf a)
-{
-  M(o,a,a);
-}
-
-sv inv25519(gf o,const gf i)
-{
-  gf c;
-  int a;
-  FOR(a,16) c[a]=i[a];
-  for(a=253;a>=0;a--) {
-    S(c,c);
-    if(a!=2&&a!=4) M(c,c,i);
-  }
-  FOR(a,16) o[a]=c[a];
-}
-
-sv pow2523(gf o,const gf i)
-{
-  gf c;
-  int a;
-  FOR(a,16) c[a]=i[a];
-  for(a=250;a>=0;a--) {
-    S(c,c);
-    if(a!=1) M(c,c,i);
-  }
-  FOR(a,16) o[a]=c[a];
-}
-
-int crypto_scalarmult(u8 *q,const u8 *n,const u8 *p)
-{
-  u8 z[32];
-  i64 x[80],r,i;
-  gf a,b,c,d,e,f;
-  FOR(i,31) z[i]=n[i];
-  z[31]=(n[31]&127)|64;
-  z[0]&=248;
-  unpack25519(x,p);
-  FOR(i,16) {
-    b[i]=x[i];
-    d[i]=a[i]=c[i]=0;
-  }
-  a[0]=d[0]=1;
-  for(i=254;i>=0;--i) {
-    r=(z[i>>3]>>(i&7))&1;
-    sel25519(a,b,r);
-    sel25519(c,d,r);
-    A(e,a,c);
-    Z(a,a,c);
-    A(c,b,d);
-    Z(b,b,d);
-    S(d,e);
-    S(f,a);
-    M(a,c,a);
-    M(c,b,e);
-    A(e,a,c);
-    Z(a,a,c);
-    S(b,a);
-    Z(c,d,f);
-    M(a,c,_121665);
-    A(a,a,d);
-    M(c,c,a);
-    M(a,d,f);
-    M(d,b,x);
-    S(b,e);
-    sel25519(a,b,r);
-    sel25519(c,d,r);
-  }
-  FOR(i,16) {
-    x[i+16]=a[i];
-    x[i+32]=c[i];
-    x[i+48]=b[i];
-    x[i+64]=d[i];
-  }
-  inv25519(x+32,x+32);
-  M(x+16,x+16,x+32);
-  pack25519(q,x+16);
-  return 0;
-}
-
-int crypto_scalarmult_base(u8 *q,const u8 *n)
-{ 
-  return crypto_scalarmult(q,n,_9);
-}
-
-int crypto_box_keypair(u8 *y,u8 *x)
-{
-  randombytes(x,32);
-  return crypto_scalarmult_base(y,x);
-}
-
-int crypto_box_beforenm(u8 *k,const u8 *y,const u8 *x)
-{
-  u8 s[32];
-  crypto_scalarmult(s,x,y);
-  return crypto_core_hsalsa20(k,_0,s,sigma);
-}
-
-int crypto_box_afternm(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *k)
-{
-  return crypto_secretbox(c,m,d,n,k);
-}
-
-int crypto_box_open_afternm(u8 *m,const u8 *c,u64 d,const u8 *n,const u8 *k)
-{
-  return crypto_secretbox_open(m,c,d,n,k);
-}
-
-int crypto_box(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *y,const u8 *x)
-{
-  u8 k[32];
-  crypto_box_beforenm(k,y,x);
-  return crypto_box_afternm(c,m,d,n,k);
-}
-
-int crypto_box_open(u8 *m,const u8 *c,u64 d,const u8 *n,const u8 *y,const u8 *x)
-{
-  u8 k[32];
-  crypto_box_beforenm(k,y,x);
-  return crypto_box_open_afternm(m,c,d,n,k);
-}
-
-static u64 R(u64 x,int c) { return (x >> c) | (x << (64 - c)); }
-static u64 Ch(u64 x,u64 y,u64 z) { return (x & y) ^ (~x & z); }
-static u64 Maj(u64 x,u64 y,u64 z) { return (x & y) ^ (x & z) ^ (y & z); }
-static u64 Sigma0(u64 x) { return R(x,28) ^ R(x,34) ^ R(x,39); }
-static u64 Sigma1(u64 x) { return R(x,14) ^ R(x,18) ^ R(x,41); }
-static u64 sigma0(u64 x) { return R(x, 1) ^ R(x, 8) ^ (x >> 7); }
-static u64 sigma1(u64 x) { return R(x,19) ^ R(x,61) ^ (x >> 6); }
-
-static const u64 K[80] = 
-{
-  0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
-  0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
-  0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
-  0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
-  0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
-  0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
-  0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
-  0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
-  0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
-  0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
-  0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
-  0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
-  0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
-  0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
-  0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
-  0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
-  0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
-  0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
-  0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
-  0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
-};
-
-int crypto_hashblocks(u8 *x,const u8 *m,u64 n)
-{
-  u64 z[8],b[8],a[8],w[16],t;
-  int i,j;
-
-  FOR(i,8) z[i] = a[i] = dl64(x + 8 * i);
-
-  while (n >= 128) {
-    FOR(i,16) w[i] = dl64(m + 8 * i);
-
-    FOR(i,80) {
-      FOR(j,8) b[j] = a[j];
-      t = a[7] + Sigma1(a[4]) + Ch(a[4],a[5],a[6]) + K[i] + w[i%16];
-      b[7] = t + Sigma0(a[0]) + Maj(a[0],a[1],a[2]);
-      b[3] += t;
-      FOR(j,8) a[(j+1)%8] = b[j];
-      if (i%16 == 15)
-	FOR(j,16)
-	  w[j] += w[(j+9)%16] + sigma0(w[(j+1)%16]) + sigma1(w[(j+14)%16]);
-    }
-
-    FOR(i,8) { a[i] += z[i]; z[i] = a[i]; }
-
-    m += 128;
-    n -= 128;
-  }
-
-  FOR(i,8) ts64(x+8*i,z[i]);
-
-  return n;
-}
-
-static const u8 iv[64] = {
-  0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08,
-  0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b,
-  0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b,
-  0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1,
-  0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1,
-  0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f,
-  0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b,
-  0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79
-} ;
-
-int crypto_hash(u8 *out,const u8 *m,u64 n)
-{
-  u8 h[64],x[256];
-  u64 i,b = n;
-
-  FOR(i,64) h[i] = iv[i];
-
-  crypto_hashblocks(h,m,n);
-  m += n;
-  n &= 127;
-  m -= n;
-
-  FOR(i,256) x[i] = 0;
-  FOR(i,n) x[i] = m[i];
-  x[n] = 128;
-
-  n = 256-128*(n<112);
-  x[n-9] = b >> 61;
-  ts64(x+n-8,b<<3);
-  crypto_hashblocks(h,x,n);
-
-  FOR(i,64) out[i] = h[i];
-
-  return 0;
-}
-
-sv add(gf p[4],gf q[4])
-{
-  gf a,b,c,d,t,e,f,g,h;
-  
-  Z(a, p[1], p[0]);
-  Z(t, q[1], q[0]);
-  M(a, a, t);
-  A(b, p[0], p[1]);
-  A(t, q[0], q[1]);
-  M(b, b, t);
-  M(c, p[3], q[3]);
-  M(c, c, D2);
-  M(d, p[2], q[2]);
-  A(d, d, d);
-  Z(e, b, a);
-  Z(f, d, c);
-  A(g, d, c);
-  A(h, b, a);
-
-  M(p[0], e, f);
-  M(p[1], h, g);
-  M(p[2], g, f);
-  M(p[3], e, h);
-}
-
-sv cswap(gf p[4],gf q[4],u8 b)
-{
-  int i;
-  FOR(i,4)
-    sel25519(p[i],q[i],b);
-}
-
-sv pack(u8 *r,gf p[4])
-{
-  gf tx, ty, zi;
-  inv25519(zi, p[2]); 
-  M(tx, p[0], zi);
-  M(ty, p[1], zi);
-  pack25519(r, ty);
-  r[31] ^= par25519(tx) << 7;
-}
-
-sv scalarmult(gf p[4],gf q[4],const u8 *s)
-{
-  int i;
-  set25519(p[0],gf0);
-  set25519(p[1],gf1);
-  set25519(p[2],gf1);
-  set25519(p[3],gf0);
-  for (i = 255;i >= 0;--i) {
-    u8 b = (s[i/8]>>(i&7))&1;
-    cswap(p,q,b);
-    add(q,p);
-    add(p,p);
-    cswap(p,q,b);
-  }
-}
-
-sv scalarbase(gf p[4],const u8 *s)
-{
-  gf q[4];
-  set25519(q[0],X);
-  set25519(q[1],Y);
-  set25519(q[2],gf1);
-  M(q[3],X,Y);
-  scalarmult(p,q,s);
-}
-
-int crypto_sign_keypair(u8 *pk, u8 *sk)
-{
-  u8 d[64];
-  gf p[4];
-  int i;
-
-  randombytes(sk, 32);
-  crypto_hash(d, sk, 32);
-  d[0] &= 248;
-  d[31] &= 127;
-  d[31] |= 64;
-
-  scalarbase(p,d);
-  pack(pk,p);
-
-  FOR(i,32) sk[32 + i] = pk[i];
-  return 0;
-}
-
-static const u64 L[32] = {0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10};
-
-sv modL(u8 *r,i64 x[64])
-{
-  i64 carry,i,j;
-  for (i = 63;i >= 32;--i) {
-    carry = 0;
-    for (j = i - 32;j < i - 12;++j) {
-      x[j] += carry - 16 * x[i] * L[j - (i - 32)];
-      carry = (x[j] + 128) >> 8;
-      x[j] -= carry << 8;
-    }
-    x[j] += carry;
-    x[i] = 0;
-  }
-  carry = 0;
-  FOR(j,32) {
-    x[j] += carry - (x[31] >> 4) * L[j];
-    carry = x[j] >> 8;
-    x[j] &= 255;
-  }
-  FOR(j,32) x[j] -= carry * L[j];
-  FOR(i,32) {
-    x[i+1] += x[i] >> 8;
-    r[i] = x[i] & 255;
-  }
-}
-
-sv reduce(u8 *r)
-{
-  i64 x[64],i;
-  FOR(i,64) x[i] = (u64) r[i];
-  FOR(i,64) r[i] = 0;
-  modL(r,x);
-}
-
-int crypto_sign(u8 *sm,u64 *smlen,const u8 *m,u64 n,const u8 *sk)
-{
-  u8 d[64],h[64],r[64];
-  i64 i,j,x[64];
-  gf p[4];
-
-  crypto_hash(d, sk, 32);
-  d[0] &= 248;
-  d[31] &= 127;
-  d[31] |= 64;
-
-  *smlen = n+64;
-  FOR(i,n) sm[64 + i] = m[i];
-  FOR(i,32) sm[32 + i] = d[32 + i];
-
-  crypto_hash(r, sm+32, n+32);
-  reduce(r);
-  scalarbase(p,r);
-  pack(sm,p);
-
-  FOR(i,32) sm[i+32] = sk[i+32];
-  crypto_hash(h,sm,n + 64);
-  reduce(h);
-
-  FOR(i,64) x[i] = 0;
-  FOR(i,32) x[i] = (u64) r[i];
-  FOR(i,32) FOR(j,32) x[i+j] += h[i] * (u64) d[j];
-  modL(sm + 32,x);
-
-  return 0;
-}
-
-static int unpackneg(gf r[4],const u8 p[32])
-{
-  gf t, chk, num, den, den2, den4, den6;
-  set25519(r[2],gf1);
-  unpack25519(r[1],p);
-  S(num,r[1]);
-  M(den,num,D);
-  Z(num,num,r[2]);
-  A(den,r[2],den);
-
-  S(den2,den);
-  S(den4,den2);
-  M(den6,den4,den2);
-  M(t,den6,num);
-  M(t,t,den);
-
-  pow2523(t,t);
-  M(t,t,num);
-  M(t,t,den);
-  M(t,t,den);
-  M(r[0],t,den);
-
-  S(chk,r[0]);
-  M(chk,chk,den);
-  if (neq25519(chk, num)) M(r[0],r[0],I);
-
-  S(chk,r[0]);
-  M(chk,chk,den);
-  if (neq25519(chk, num)) return -1;
-
-  if (par25519(r[0]) == (p[31]>>7)) Z(r[0],gf0,r[0]);
-
-  M(r[3],r[0],r[1]);
-  return 0;
-}
-
-int crypto_sign_open(u8 *m,u64 *mlen,const u8 *sm,u64 n,const u8 *pk)
-{
-  int i;
-  u8 t[32],h[64];
-  gf p[4],q[4];
-
-  *mlen = -1;
-  if (n < 64) return -1;
-
-  if (unpackneg(q,pk)) return -1;
-
-  FOR(i,n) m[i] = sm[i];
-  FOR(i,32) m[i+32] = pk[i];
-  crypto_hash(h,m,n);
-  reduce(h);
-  scalarmult(p,q,h);
-
-  scalarbase(q,sm + 32);
-  add(p,q);
-  pack(t,p);
-
-  n -= 64;
-  if (crypto_verify_32(sm, t)) {
-    FOR(i,n) m[i] = 0;
-    return -1;
-  }
-
-  FOR(i,n) m[i] = sm[i + 64];
-  *mlen = n;
-  return 0;
-}

+ 0 - 278
deps/tweetnacl.h

@@ -1,278 +0,0 @@
- /*
-  * http://tweetnacl.cr.yp.to/
-  * TweetNaCl was put in the public domain by the authors Bernstein et al.
-  * The API is th same as for NaCl (http://nacl.cr.yp.to/).
-  */
-
-#ifndef TWEETNACL_H
-#define TWEETNACL_H
-#define crypto_auth_PRIMITIVE "hmacsha512256"
-#define crypto_auth crypto_auth_hmacsha512256
-#define crypto_auth_verify crypto_auth_hmacsha512256_verify
-#define crypto_auth_BYTES crypto_auth_hmacsha512256_BYTES
-#define crypto_auth_KEYBYTES crypto_auth_hmacsha512256_KEYBYTES
-#define crypto_auth_IMPLEMENTATION crypto_auth_hmacsha512256_IMPLEMENTATION
-#define crypto_auth_VERSION crypto_auth_hmacsha512256_VERSION
-#define crypto_auth_hmacsha512256_tweet_BYTES 32
-#define crypto_auth_hmacsha512256_tweet_KEYBYTES 32
-extern int crypto_auth_hmacsha512256_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *);
-extern int crypto_auth_hmacsha512256_tweet_verify(const unsigned char *,const unsigned char *,unsigned long long,const unsigned char *);
-#define crypto_auth_hmacsha512256_tweet_VERSION "-"
-#define crypto_auth_hmacsha512256 crypto_auth_hmacsha512256_tweet
-#define crypto_auth_hmacsha512256_verify crypto_auth_hmacsha512256_tweet_verify
-#define crypto_auth_hmacsha512256_BYTES crypto_auth_hmacsha512256_tweet_BYTES
-#define crypto_auth_hmacsha512256_KEYBYTES crypto_auth_hmacsha512256_tweet_KEYBYTES
-#define crypto_auth_hmacsha512256_VERSION crypto_auth_hmacsha512256_tweet_VERSION
-#define crypto_auth_hmacsha512256_IMPLEMENTATION "crypto_auth/hmacsha512256/tweet"
-#define crypto_box_PRIMITIVE "curve25519xsalsa20poly1305"
-#define crypto_box crypto_box_curve25519xsalsa20poly1305
-#define crypto_box_open crypto_box_curve25519xsalsa20poly1305_open
-#define crypto_box_keypair crypto_box_curve25519xsalsa20poly1305_keypair
-#define crypto_box_beforenm crypto_box_curve25519xsalsa20poly1305_beforenm
-#define crypto_box_afternm crypto_box_curve25519xsalsa20poly1305_afternm
-#define crypto_box_open_afternm crypto_box_curve25519xsalsa20poly1305_open_afternm
-#define crypto_box_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES
-#define crypto_box_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES
-#define crypto_box_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES
-#define crypto_box_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_NONCEBYTES
-#define crypto_box_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_ZEROBYTES
-#define crypto_box_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES
-#define crypto_box_IMPLEMENTATION crypto_box_curve25519xsalsa20poly1305_IMPLEMENTATION
-#define crypto_box_VERSION crypto_box_curve25519xsalsa20poly1305_VERSION
-#define crypto_box_curve25519xsalsa20poly1305_tweet_PUBLICKEYBYTES 32
-#define crypto_box_curve25519xsalsa20poly1305_tweet_SECRETKEYBYTES 32
-#define crypto_box_curve25519xsalsa20poly1305_tweet_BEFORENMBYTES 32
-#define crypto_box_curve25519xsalsa20poly1305_tweet_NONCEBYTES 24
-#define crypto_box_curve25519xsalsa20poly1305_tweet_ZEROBYTES 32
-#define crypto_box_curve25519xsalsa20poly1305_tweet_BOXZEROBYTES 16
-extern int crypto_box_curve25519xsalsa20poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *,const unsigned char *);
-extern int crypto_box_curve25519xsalsa20poly1305_tweet_open(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *,const unsigned char *);
-extern int crypto_box_curve25519xsalsa20poly1305_tweet_keypair(unsigned char *,unsigned char *);
-extern int crypto_box_curve25519xsalsa20poly1305_tweet_beforenm(unsigned char *,const unsigned char *,const unsigned char *);
-extern int crypto_box_curve25519xsalsa20poly1305_tweet_afternm(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *);
-extern int crypto_box_curve25519xsalsa20poly1305_tweet_open_afternm(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *);
-#define crypto_box_curve25519xsalsa20poly1305_tweet_VERSION "-"
-#define crypto_box_curve25519xsalsa20poly1305 crypto_box_curve25519xsalsa20poly1305_tweet
-#define crypto_box_curve25519xsalsa20poly1305_open crypto_box_curve25519xsalsa20poly1305_tweet_open
-#define crypto_box_curve25519xsalsa20poly1305_keypair crypto_box_curve25519xsalsa20poly1305_tweet_keypair
-#define crypto_box_curve25519xsalsa20poly1305_beforenm crypto_box_curve25519xsalsa20poly1305_tweet_beforenm
-#define crypto_box_curve25519xsalsa20poly1305_afternm crypto_box_curve25519xsalsa20poly1305_tweet_afternm
-#define crypto_box_curve25519xsalsa20poly1305_open_afternm crypto_box_curve25519xsalsa20poly1305_tweet_open_afternm
-#define crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_tweet_PUBLICKEYBYTES
-#define crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_tweet_SECRETKEYBYTES
-#define crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_tweet_BEFORENMBYTES
-#define crypto_box_curve25519xsalsa20poly1305_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_tweet_NONCEBYTES
-#define crypto_box_curve25519xsalsa20poly1305_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_tweet_ZEROBYTES
-#define crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_tweet_BOXZEROBYTES
-#define crypto_box_curve25519xsalsa20poly1305_VERSION crypto_box_curve25519xsalsa20poly1305_tweet_VERSION
-#define crypto_box_curve25519xsalsa20poly1305_IMPLEMENTATION "crypto_box/curve25519xsalsa20poly1305/tweet"
-#define crypto_core_PRIMITIVE "salsa20"
-#define crypto_core crypto_core_salsa20
-#define crypto_core_OUTPUTBYTES crypto_core_salsa20_OUTPUTBYTES
-#define crypto_core_INPUTBYTES crypto_core_salsa20_INPUTBYTES
-#define crypto_core_KEYBYTES crypto_core_salsa20_KEYBYTES
-#define crypto_core_CONSTBYTES crypto_core_salsa20_CONSTBYTES
-#define crypto_core_IMPLEMENTATION crypto_core_salsa20_IMPLEMENTATION
-#define crypto_core_VERSION crypto_core_salsa20_VERSION
-#define crypto_core_salsa20_tweet_OUTPUTBYTES 64
-#define crypto_core_salsa20_tweet_INPUTBYTES 16
-#define crypto_core_salsa20_tweet_KEYBYTES 32
-#define crypto_core_salsa20_tweet_CONSTBYTES 16
-extern int crypto_core_salsa20_tweet(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *);
-#define crypto_core_salsa20_tweet_VERSION "-"
-#define crypto_core_salsa20 crypto_core_salsa20_tweet
-#define crypto_core_salsa20_OUTPUTBYTES crypto_core_salsa20_tweet_OUTPUTBYTES
-#define crypto_core_salsa20_INPUTBYTES crypto_core_salsa20_tweet_INPUTBYTES
-#define crypto_core_salsa20_KEYBYTES crypto_core_salsa20_tweet_KEYBYTES
-#define crypto_core_salsa20_CONSTBYTES crypto_core_salsa20_tweet_CONSTBYTES
-#define crypto_core_salsa20_VERSION crypto_core_salsa20_tweet_VERSION
-#define crypto_core_salsa20_IMPLEMENTATION "crypto_core/salsa20/tweet"
-#define crypto_core_hsalsa20_tweet_OUTPUTBYTES 32
-#define crypto_core_hsalsa20_tweet_INPUTBYTES 16
-#define crypto_core_hsalsa20_tweet_KEYBYTES 32
-#define crypto_core_hsalsa20_tweet_CONSTBYTES 16
-extern int crypto_core_hsalsa20_tweet(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *);
-#define crypto_core_hsalsa20_tweet_VERSION "-"
-#define crypto_core_hsalsa20 crypto_core_hsalsa20_tweet
-#define crypto_core_hsalsa20_OUTPUTBYTES crypto_core_hsalsa20_tweet_OUTPUTBYTES
-#define crypto_core_hsalsa20_INPUTBYTES crypto_core_hsalsa20_tweet_INPUTBYTES
-#define crypto_core_hsalsa20_KEYBYTES crypto_core_hsalsa20_tweet_KEYBYTES
-#define crypto_core_hsalsa20_CONSTBYTES crypto_core_hsalsa20_tweet_CONSTBYTES
-#define crypto_core_hsalsa20_VERSION crypto_core_hsalsa20_tweet_VERSION
-#define crypto_core_hsalsa20_IMPLEMENTATION "crypto_core/hsalsa20/tweet"
-#define crypto_hashblocks_PRIMITIVE "sha512"
-#define crypto_hashblocks crypto_hashblocks_sha512
-#define crypto_hashblocks_STATEBYTES crypto_hashblocks_sha512_STATEBYTES
-#define crypto_hashblocks_BLOCKBYTES crypto_hashblocks_sha512_BLOCKBYTES
-#define crypto_hashblocks_IMPLEMENTATION crypto_hashblocks_sha512_IMPLEMENTATION
-#define crypto_hashblocks_VERSION crypto_hashblocks_sha512_VERSION
-#define crypto_hashblocks_sha512_tweet_STATEBYTES 64
-#define crypto_hashblocks_sha512_tweet_BLOCKBYTES 128
-extern int crypto_hashblocks_sha512_tweet(unsigned char *,const unsigned char *,unsigned long long);
-#define crypto_hashblocks_sha512_tweet_VERSION "-"
-#define crypto_hashblocks_sha512 crypto_hashblocks_sha512_tweet
-#define crypto_hashblocks_sha512_STATEBYTES crypto_hashblocks_sha512_tweet_STATEBYTES
-#define crypto_hashblocks_sha512_BLOCKBYTES crypto_hashblocks_sha512_tweet_BLOCKBYTES
-#define crypto_hashblocks_sha512_VERSION crypto_hashblocks_sha512_tweet_VERSION
-#define crypto_hashblocks_sha512_IMPLEMENTATION "crypto_hashblocks/sha512/tweet"
-#define crypto_hashblocks_sha256_tweet_STATEBYTES 32
-#define crypto_hashblocks_sha256_tweet_BLOCKBYTES 64
-extern int crypto_hashblocks_sha256_tweet(unsigned char *,const unsigned char *,unsigned long long);
-#define crypto_hashblocks_sha256_tweet_VERSION "-"
-#define crypto_hashblocks_sha256 crypto_hashblocks_sha256_tweet
-#define crypto_hashblocks_sha256_STATEBYTES crypto_hashblocks_sha256_tweet_STATEBYTES
-#define crypto_hashblocks_sha256_BLOCKBYTES crypto_hashblocks_sha256_tweet_BLOCKBYTES
-#define crypto_hashblocks_sha256_VERSION crypto_hashblocks_sha256_tweet_VERSION
-#define crypto_hashblocks_sha256_IMPLEMENTATION "crypto_hashblocks/sha256/tweet"
-#define crypto_hash_PRIMITIVE "sha512"
-#define crypto_hash crypto_hash_sha512
-#define crypto_hash_BYTES crypto_hash_sha512_BYTES
-#define crypto_hash_IMPLEMENTATION crypto_hash_sha512_IMPLEMENTATION
-#define crypto_hash_VERSION crypto_hash_sha512_VERSION
-#define crypto_hash_sha512_tweet_BYTES 64
-extern int crypto_hash_sha512_tweet(unsigned char *,const unsigned char *,unsigned long long);
-#define crypto_hash_sha512_tweet_VERSION "-"
-#define crypto_hash_sha512 crypto_hash_sha512_tweet
-#define crypto_hash_sha512_BYTES crypto_hash_sha512_tweet_BYTES
-#define crypto_hash_sha512_VERSION crypto_hash_sha512_tweet_VERSION
-#define crypto_hash_sha512_IMPLEMENTATION "crypto_hash/sha512/tweet"
-#define crypto_hash_sha256_tweet_BYTES 32
-extern int crypto_hash_sha256_tweet(unsigned char *,const unsigned char *,unsigned long long);
-#define crypto_hash_sha256_tweet_VERSION "-"
-#define crypto_hash_sha256 crypto_hash_sha256_tweet
-#define crypto_hash_sha256_BYTES crypto_hash_sha256_tweet_BYTES
-#define crypto_hash_sha256_VERSION crypto_hash_sha256_tweet_VERSION
-#define crypto_hash_sha256_IMPLEMENTATION "crypto_hash/sha256/tweet"
-#define crypto_onetimeauth_PRIMITIVE "poly1305"
-#define crypto_onetimeauth crypto_onetimeauth_poly1305
-#define crypto_onetimeauth_verify crypto_onetimeauth_poly1305_verify
-#define crypto_onetimeauth_BYTES crypto_onetimeauth_poly1305_BYTES
-#define crypto_onetimeauth_KEYBYTES crypto_onetimeauth_poly1305_KEYBYTES
-#define crypto_onetimeauth_IMPLEMENTATION crypto_onetimeauth_poly1305_IMPLEMENTATION
-#define crypto_onetimeauth_VERSION crypto_onetimeauth_poly1305_VERSION
-#define crypto_onetimeauth_poly1305_tweet_BYTES 16
-#define crypto_onetimeauth_poly1305_tweet_KEYBYTES 32
-extern int crypto_onetimeauth_poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *);
-extern int crypto_onetimeauth_poly1305_tweet_verify(const unsigned char *,const unsigned char *,unsigned long long,const unsigned char *);
-#define crypto_onetimeauth_poly1305_tweet_VERSION "-"
-#define crypto_onetimeauth_poly1305 crypto_onetimeauth_poly1305_tweet
-#define crypto_onetimeauth_poly1305_verify crypto_onetimeauth_poly1305_tweet_verify
-#define crypto_onetimeauth_poly1305_BYTES crypto_onetimeauth_poly1305_tweet_BYTES
-#define crypto_onetimeauth_poly1305_KEYBYTES crypto_onetimeauth_poly1305_tweet_KEYBYTES
-#define crypto_onetimeauth_poly1305_VERSION crypto_onetimeauth_poly1305_tweet_VERSION
-#define crypto_onetimeauth_poly1305_IMPLEMENTATION "crypto_onetimeauth/poly1305/tweet"
-#define crypto_scalarmult_PRIMITIVE "curve25519"
-#define crypto_scalarmult crypto_scalarmult_curve25519
-#define crypto_scalarmult_base crypto_scalarmult_curve25519_base
-#define crypto_scalarmult_BYTES crypto_scalarmult_curve25519_BYTES
-#define crypto_scalarmult_SCALARBYTES crypto_scalarmult_curve25519_SCALARBYTES
-#define crypto_scalarmult_IMPLEMENTATION crypto_scalarmult_curve25519_IMPLEMENTATION
-#define crypto_scalarmult_VERSION crypto_scalarmult_curve25519_VERSION
-#define crypto_scalarmult_curve25519_tweet_BYTES 32
-#define crypto_scalarmult_curve25519_tweet_SCALARBYTES 32
-extern int crypto_scalarmult_curve25519_tweet(unsigned char *,const unsigned char *,const unsigned char *);
-extern int crypto_scalarmult_curve25519_tweet_base(unsigned char *,const unsigned char *);
-#define crypto_scalarmult_curve25519_tweet_VERSION "-"
-#define crypto_scalarmult_curve25519 crypto_scalarmult_curve25519_tweet
-#define crypto_scalarmult_curve25519_base crypto_scalarmult_curve25519_tweet_base
-#define crypto_scalarmult_curve25519_BYTES crypto_scalarmult_curve25519_tweet_BYTES
-#define crypto_scalarmult_curve25519_SCALARBYTES crypto_scalarmult_curve25519_tweet_SCALARBYTES
-#define crypto_scalarmult_curve25519_VERSION crypto_scalarmult_curve25519_tweet_VERSION
-#define crypto_scalarmult_curve25519_IMPLEMENTATION "crypto_scalarmult/curve25519/tweet"
-#define crypto_secretbox_PRIMITIVE "xsalsa20poly1305"
-#define crypto_secretbox crypto_secretbox_xsalsa20poly1305
-#define crypto_secretbox_open crypto_secretbox_xsalsa20poly1305_open
-#define crypto_secretbox_KEYBYTES crypto_secretbox_xsalsa20poly1305_KEYBYTES
-#define crypto_secretbox_NONCEBYTES crypto_secretbox_xsalsa20poly1305_NONCEBYTES
-#define crypto_secretbox_ZEROBYTES crypto_secretbox_xsalsa20poly1305_ZEROBYTES
-#define crypto_secretbox_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES
-#define crypto_secretbox_IMPLEMENTATION crypto_secretbox_xsalsa20poly1305_IMPLEMENTATION
-#define crypto_secretbox_VERSION crypto_secretbox_xsalsa20poly1305_VERSION
-#define crypto_secretbox_xsalsa20poly1305_tweet_KEYBYTES 32
-#define crypto_secretbox_xsalsa20poly1305_tweet_NONCEBYTES 24
-#define crypto_secretbox_xsalsa20poly1305_tweet_ZEROBYTES 32
-#define crypto_secretbox_xsalsa20poly1305_tweet_BOXZEROBYTES 16
-extern int crypto_secretbox_xsalsa20poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *);
-extern int crypto_secretbox_xsalsa20poly1305_tweet_open(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *);
-#define crypto_secretbox_xsalsa20poly1305_tweet_VERSION "-"
-#define crypto_secretbox_xsalsa20poly1305 crypto_secretbox_xsalsa20poly1305_tweet
-#define crypto_secretbox_xsalsa20poly1305_open crypto_secretbox_xsalsa20poly1305_tweet_open
-#define crypto_secretbox_xsalsa20poly1305_KEYBYTES crypto_secretbox_xsalsa20poly1305_tweet_KEYBYTES
-#define crypto_secretbox_xsalsa20poly1305_NONCEBYTES crypto_secretbox_xsalsa20poly1305_tweet_NONCEBYTES
-#define crypto_secretbox_xsalsa20poly1305_ZEROBYTES crypto_secretbox_xsalsa20poly1305_tweet_ZEROBYTES
-#define crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_tweet_BOXZEROBYTES
-#define crypto_secretbox_xsalsa20poly1305_VERSION crypto_secretbox_xsalsa20poly1305_tweet_VERSION
-#define crypto_secretbox_xsalsa20poly1305_IMPLEMENTATION "crypto_secretbox/xsalsa20poly1305/tweet"
-#define crypto_sign_PRIMITIVE "ed25519"
-#define crypto_sign crypto_sign_ed25519
-#define crypto_sign_open crypto_sign_ed25519_open
-#define crypto_sign_keypair crypto_sign_ed25519_keypair
-#define crypto_sign_BYTES crypto_sign_ed25519_BYTES
-#define crypto_sign_PUBLICKEYBYTES crypto_sign_ed25519_PUBLICKEYBYTES
-#define crypto_sign_SECRETKEYBYTES crypto_sign_ed25519_SECRETKEYBYTES
-#define crypto_sign_IMPLEMENTATION crypto_sign_ed25519_IMPLEMENTATION
-#define crypto_sign_VERSION crypto_sign_ed25519_VERSION
-#define crypto_sign_ed25519_tweet_BYTES 64
-#define crypto_sign_ed25519_tweet_PUBLICKEYBYTES 32
-#define crypto_sign_ed25519_tweet_SECRETKEYBYTES 64
-extern int crypto_sign_ed25519_tweet(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *);
-extern int crypto_sign_ed25519_tweet_open(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *);
-extern int crypto_sign_ed25519_tweet_keypair(unsigned char *,unsigned char *);
-#define crypto_sign_ed25519_tweet_VERSION "-"
-#define crypto_sign_ed25519 crypto_sign_ed25519_tweet
-#define crypto_sign_ed25519_open crypto_sign_ed25519_tweet_open
-#define crypto_sign_ed25519_keypair crypto_sign_ed25519_tweet_keypair
-#define crypto_sign_ed25519_BYTES crypto_sign_ed25519_tweet_BYTES
-#define crypto_sign_ed25519_PUBLICKEYBYTES crypto_sign_ed25519_tweet_PUBLICKEYBYTES
-#define crypto_sign_ed25519_SECRETKEYBYTES crypto_sign_ed25519_tweet_SECRETKEYBYTES
-#define crypto_sign_ed25519_VERSION crypto_sign_ed25519_tweet_VERSION
-#define crypto_sign_ed25519_IMPLEMENTATION "crypto_sign/ed25519/tweet"
-#define crypto_stream_PRIMITIVE "xsalsa20"
-#define crypto_stream crypto_stream_xsalsa20
-#define crypto_stream_xor crypto_stream_xsalsa20_xor
-#define crypto_stream_KEYBYTES crypto_stream_xsalsa20_KEYBYTES
-#define crypto_stream_NONCEBYTES crypto_stream_xsalsa20_NONCEBYTES
-#define crypto_stream_IMPLEMENTATION crypto_stream_xsalsa20_IMPLEMENTATION
-#define crypto_stream_VERSION crypto_stream_xsalsa20_VERSION
-#define crypto_stream_xsalsa20_tweet_KEYBYTES 32
-#define crypto_stream_xsalsa20_tweet_NONCEBYTES 24
-extern int crypto_stream_xsalsa20_tweet(unsigned char *,unsigned long long,const unsigned char *,const unsigned char *);
-extern int crypto_stream_xsalsa20_tweet_xor(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *);
-#define crypto_stream_xsalsa20_tweet_VERSION "-"
-#define crypto_stream_xsalsa20 crypto_stream_xsalsa20_tweet
-#define crypto_stream_xsalsa20_xor crypto_stream_xsalsa20_tweet_xor
-#define crypto_stream_xsalsa20_KEYBYTES crypto_stream_xsalsa20_tweet_KEYBYTES
-#define crypto_stream_xsalsa20_NONCEBYTES crypto_stream_xsalsa20_tweet_NONCEBYTES
-#define crypto_stream_xsalsa20_VERSION crypto_stream_xsalsa20_tweet_VERSION
-#define crypto_stream_xsalsa20_IMPLEMENTATION "crypto_stream/xsalsa20/tweet"
-#define crypto_stream_salsa20_tweet_KEYBYTES 32
-#define crypto_stream_salsa20_tweet_NONCEBYTES 8
-extern int crypto_stream_salsa20_tweet(unsigned char *,unsigned long long,const unsigned char *,const unsigned char *);
-extern int crypto_stream_salsa20_tweet_xor(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *);
-#define crypto_stream_salsa20_tweet_VERSION "-"
-#define crypto_stream_salsa20 crypto_stream_salsa20_tweet
-#define crypto_stream_salsa20_xor crypto_stream_salsa20_tweet_xor
-#define crypto_stream_salsa20_KEYBYTES crypto_stream_salsa20_tweet_KEYBYTES
-#define crypto_stream_salsa20_NONCEBYTES crypto_stream_salsa20_tweet_NONCEBYTES
-#define crypto_stream_salsa20_VERSION crypto_stream_salsa20_tweet_VERSION
-#define crypto_stream_salsa20_IMPLEMENTATION "crypto_stream/salsa20/tweet"
-#define crypto_verify_PRIMITIVE "16"
-#define crypto_verify crypto_verify_16
-#define crypto_verify_BYTES crypto_verify_16_BYTES
-#define crypto_verify_IMPLEMENTATION crypto_verify_16_IMPLEMENTATION
-#define crypto_verify_VERSION crypto_verify_16_VERSION
-#define crypto_verify_16_tweet_BYTES 16
-extern int crypto_verify_16_tweet(const unsigned char *,const unsigned char *);
-#define crypto_verify_16_tweet_VERSION "-"
-#define crypto_verify_16 crypto_verify_16_tweet
-#define crypto_verify_16_BYTES crypto_verify_16_tweet_BYTES
-#define crypto_verify_16_VERSION crypto_verify_16_tweet_VERSION
-#define crypto_verify_16_IMPLEMENTATION "crypto_verify/16/tweet"
-#define crypto_verify_32_tweet_BYTES 32
-extern int crypto_verify_32_tweet(const unsigned char *,const unsigned char *);
-#define crypto_verify_32_tweet_VERSION "-"
-#define crypto_verify_32 crypto_verify_32_tweet
-#define crypto_verify_32_BYTES crypto_verify_32_tweet_BYTES
-#define crypto_verify_32_VERSION crypto_verify_32_tweet_VERSION
-#define crypto_verify_32_IMPLEMENTATION "crypto_verify/32/tweet"
-#endif

+ 1 - 0
include/ua_config.h.in

@@ -9,6 +9,7 @@
 #cmakedefine UA_MULTITHREADING
 #cmakedefine ENABLE_METHODCALLS
 #cmakedefine ENABLE_SUBSCRIPTIONS
+#cmakedefine ENABLE_TYPEINTROSPECTION
 
 /* Function Export */
 #ifdef _WIN32

+ 6 - 0
include/ua_types.h

@@ -607,6 +607,9 @@ UA_StatusCode UA_EXPORT UA_DiagnosticInfo_copy(const UA_DiagnosticInfo *src, UA_
 #define UA_IS_BUILTIN(ID) (ID <= UA_TYPES_DIAGNOSTICINFO)
 
 typedef struct {
+#ifdef ENABLE_TYPEINTROSPECTION
+    const char *memberName;
+#endif
     UA_UInt16 memberTypeIndex; ///< Index of the member in the datatypetable
     UA_Byte padding; /**< How much padding is there before this member element? For arrays this is
                           split into 2 bytes padding before the length index (max 4 bytes) and 3
@@ -618,6 +621,9 @@ typedef struct {
 } UA_DataTypeMember;
     
 struct UA_DataType {
+#ifdef ENABLE_TYPEINTROSPECTION
+    const char *typeName;
+#endif
     UA_NodeId typeId; ///< The nodeid of the type
     UA_UInt16 memSize; ///< Size of the struct in memory
     UA_UInt16 typeIndex; ///< Index of the type in the datatypetable

+ 12 - 2
src/client/ua_client.c

@@ -29,6 +29,7 @@ struct UA_Client {
     UA_UserTokenPolicy token;
     UA_NodeId sessionId;
     UA_NodeId authenticationToken;
+    UA_UInt32 requestHandle;
     
 #ifdef ENABLE_SUBSCRIPTIONS
     UA_Int32 monitoredItemHandles;
@@ -71,6 +72,7 @@ void UA_Client_init(UA_Client* client, UA_ClientConfig config, UA_Logger logger)
     client->requestId = 0;
 
     UA_NodeId_init(&client->authenticationToken);
+    client->requestHandle = 0;
 
     client->logger = logger;
     client->config = config;
@@ -187,7 +189,7 @@ static UA_StatusCode SecureChannelHandshake(UA_Client *client, UA_Boolean renew)
         opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_RENEW;
     } else {
         opnSecRq.requestType = UA_SECURITYTOKENREQUESTTYPE_ISSUE;
-        UA_SecureChannel_generateNonce(&client->channel.clientNonce);
+        UA_ByteString_init(&client->channel.clientNonce);
         UA_ByteString_copy(&client->channel.clientNonce, &opnSecRq.clientNonce);
         opnSecRq.securityMode = UA_MESSAGESECURITYMODE_NONE;
     }
@@ -280,13 +282,21 @@ static void synchronousRequest(UA_Client *client, void *request, const UA_DataTy
         return;
     }
 
-    /* Copy authenticationToken token to request header */
+    /* HANDLING REQUEST HEADER PARAMETERS */
     typedef struct {
         UA_RequestHeader requestHeader;
     } headerOnlyRequest;
     /* The cast is valid, since all requests start with a requestHeader */
+
+    /* Copy authenticationToken token to request header */
     UA_NodeId_copy(&client->authenticationToken, &((headerOnlyRequest*)request)->requestHeader.authenticationToken);
 
+    ((headerOnlyRequest*)request)->requestHeader.timestamp = UA_DateTime_now();
+
+    ((headerOnlyRequest*)request)->requestHeader.requestHandle = ++client->requestHandle;
+
+    /*/HANDLING REQUEST HEADER PARAMETERS */
+
     /* Send the request */
     UA_UInt32 requestId = ++client->requestId;
     retval = UA_SecureChannel_sendBinaryMessage(&client->channel, requestId,

+ 4 - 5
src/server/ua_server_worker.c

@@ -325,14 +325,11 @@ UA_StatusCode UA_Server_addRepeatedJob(UA_Server *server, UA_Job job, UA_UInt32
 /* Returns the timeout until the next repeated job in ms */
 static UA_UInt16 processRepeatedJobs(UA_Server *server) {
     UA_DateTime current = UA_DateTime_now();
-    struct RepeatedJobs *next = LIST_FIRST(&server->repeatedJobs);
     struct RepeatedJobs *tw = UA_NULL;
 
-    while(next) {
-        tw = next;
+    while((tw = LIST_FIRST(&server->repeatedJobs)) != UA_NULL) {
         if(tw->nextTime > current)
             break;
-        next = LIST_NEXT(tw, pointers);
 
 #ifdef UA_MULTITHREADING
         // copy the entry and insert at the new location
@@ -346,10 +343,12 @@ static UA_UInt16 processRepeatedJobs(UA_Server *server) {
         dispatchJobs(server, jobsCopy, tw->jobsSize); // frees the job pointer
 #else
         for(size_t i=0;i<tw->jobsSize;i++)
+            //processJobs may sort the list but dont delete entries
             processJobs(server, &tw->jobs[i].job, 1); // does not free the job ptr
 #endif
         tw->nextTime += tw->interval;
-        struct RepeatedJobs *prevTw = tw; // after which tw do we insert?
+        //start iterating the list from the beginning
+        struct RepeatedJobs *prevTw = LIST_FIRST(&server->repeatedJobs); // after which tw do we insert?
         while(UA_TRUE) {
             struct RepeatedJobs *n = LIST_NEXT(prevTw, pointers);
             if(!n || n->nextTime > tw->nextTime)

+ 6 - 6
src/server/ua_services_subscription.c

@@ -21,7 +21,7 @@ void Service_CreateSubscription(UA_Server *server, UA_Session *session,
     /* set the publishing interval */
     UA_BOUNDEDVALUE_SETWBOUNDS(session->subscriptionManager.globalPublishingInterval,
                                request->requestedPublishingInterval, response->revisedPublishingInterval);
-    newSubscription->publishingInterval = response->revisedPublishingInterval;
+    newSubscription->publishingInterval = (UA_DateTime)response->revisedPublishingInterval;
     
     /* set the subscription lifetime (deleted when no publish requests arrive within this time) */
     UA_BOUNDEDVALUE_SETWBOUNDS(session->subscriptionManager.globalLifeTimeCount,
@@ -83,7 +83,7 @@ static void createMonitoredItems(UA_Server *server, UA_Session *session, UA_Subs
     UA_BOUNDEDVALUE_SETWBOUNDS(session->subscriptionManager.globalSamplingInterval,
                                request->requestedParameters.samplingInterval,
                                result->revisedSamplingInterval);
-    newMon->samplingInterval = result->revisedSamplingInterval;
+    newMon->samplingInterval = (UA_UInt32)result->revisedSamplingInterval;
 
     /* set the queue size */
     UA_BOUNDEDVALUE_SETWBOUNDS(session->subscriptionManager.globalQueueSize,
@@ -148,7 +148,7 @@ void Service_Publish(UA_Server *server, UA_Session *session, const UA_PublishReq
             response->results[i] = UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
             continue;
         }
-        if(Subscription_deleteUnpublishedNotification(request->subscriptionAcknowledgements[i].sequenceNumber, sub) == 0)
+        if(Subscription_deleteUnpublishedNotification(request->subscriptionAcknowledgements[i].sequenceNumber, false, sub) == 0)
             response->results[i] = UA_STATUSCODE_BADSEQUENCENUMBERINVALID;
     }
     
@@ -176,7 +176,7 @@ void Service_Publish(UA_Server *server, UA_Session *session, const UA_PublishReq
             // If this is a keepalive message, its seqNo is the next seqNo to be used for an actual msg.
             response->availableSequenceNumbersSize = 0;
             // .. and must be deleted
-            Subscription_deleteUnpublishedNotification(sub->sequenceNumber + 1, sub);
+            Subscription_deleteUnpublishedNotification(sub->sequenceNumber + 1, false, sub);
         } else {
             response->availableSequenceNumbersSize = Subscription_queuedNotifications(sub);
             response->availableSequenceNumbers = Subscription_getAvailableSequenceNumbers(sub);
@@ -196,7 +196,7 @@ void Service_Publish(UA_Server *server, UA_Session *session, const UA_PublishReq
         sub->keepAliveCount.currentValue=sub->keepAliveCount.minValue;
         Subscription_generateKeepAlive(sub);
         Subscription_copyTopNotificationMessage(&response->notificationMessage, sub);
-        Subscription_deleteUnpublishedNotification(sub->sequenceNumber + 1, sub);
+        Subscription_deleteUnpublishedNotification(sub->sequenceNumber + 1, false, sub);
     }
     
     // FIXME: This should be in processMSG();
@@ -215,7 +215,7 @@ void Service_ModifySubscription(UA_Server *server, UA_Session *session,
     
     UA_BOUNDEDVALUE_SETWBOUNDS(session->subscriptionManager.globalPublishingInterval,
                                request->requestedPublishingInterval, response->revisedPublishingInterval);
-    sub->publishingInterval = response->revisedPublishingInterval;
+    sub->publishingInterval = (UA_DateTime)response->revisedPublishingInterval;
     
     UA_BOUNDEDVALUE_SETWBOUNDS(session->subscriptionManager.globalLifeTimeCount,
                                request->requestedLifetimeCount, response->revisedLifetimeCount);

+ 5 - 9
src/server/ua_subscription.c

@@ -22,7 +22,6 @@ UA_Subscription *UA_Subscription_new(UA_Int32 subscriptionID) {
 }
 
 void UA_Subscription_deleteMembers(UA_Subscription *subscription, UA_Server *server) {
-    UA_unpublishedNotification *not, *tmp_not;
     UA_MonitoredItem *mon, *tmp_mon;
     
     // Just in case any parallel process attempts to access this subscription
@@ -36,9 +35,7 @@ void UA_Subscription_deleteMembers(UA_Subscription *subscription, UA_Server *ser
     }
     
     // Delete unpublished Notifications
-    LIST_FOREACH_SAFE(not, &subscription->unpublishedNotifications, listEntry, tmp_not) {
-        Subscription_deleteUnpublishedNotification(not->notification->sequenceNumber, subscription);
-    }
+    Subscription_deleteUnpublishedNotification(0, true, subscription);
     
     // Unhook/Unregister any timed work assiociated with this subscription
     if(subscription->timedUpdateJob != UA_NULL){
@@ -80,7 +77,7 @@ void Subscription_generateKeepAlive(UA_Subscription *subscription) {
 void Subscription_updateNotifications(UA_Subscription *subscription) {
     UA_MonitoredItem *mon;
     //MonitoredItem_queuedValue *queuedValue;
-    UA_unpublishedNotification *msg = NULL, *tempmsg;
+    UA_unpublishedNotification *msg;
     UA_UInt32 monItemsChangeT = 0, monItemsStatusT = 0, monItemsEventT = 0;
     UA_DataChangeNotification *changeNotification;
     size_t notificationOffset;
@@ -105,8 +102,7 @@ void Subscription_updateNotifications(UA_Subscription *subscription) {
     // FIXME: This is hardcoded to 100 because it is not covered by the spec but we need to protect the server!
     if(Subscription_queuedNotifications(subscription) >= 10) {
         // Remove last entry
-        LIST_FOREACH_SAFE(msg, &subscription->unpublishedNotifications, listEntry, tempmsg)
-            Subscription_deleteUnpublishedNotification(msg->notification->sequenceNumber, subscription);
+        Subscription_deleteUnpublishedNotification(0, true, subscription);
     }
     
     if(monItemsChangeT == 0 && monItemsEventT == 0 && monItemsStatusT == 0) {
@@ -226,11 +222,11 @@ void Subscription_copyTopNotificationMessage(UA_NotificationMessage *dst, UA_Sub
                        &dst->notificationData->body);
 }
 
-UA_UInt32 Subscription_deleteUnpublishedNotification(UA_UInt32 seqNo, UA_Subscription *sub) {
+UA_UInt32 Subscription_deleteUnpublishedNotification(UA_UInt32 seqNo, UA_Boolean bDeleteAll, UA_Subscription *sub) {
     UA_UInt32 deletedItems = 0;
     UA_unpublishedNotification *not, *tmp;
     LIST_FOREACH_SAFE(not, &sub->unpublishedNotifications, listEntry, tmp) {
-        if(not->notification->sequenceNumber != seqNo)
+        if (!bDeleteAll && not->notification->sequenceNumber != seqNo)
             continue;
         LIST_REMOVE(not, listEntry);
         if(not->notification) {

+ 3 - 3
src/server/ua_subscription.h

@@ -45,7 +45,7 @@ typedef struct UA_MonitoredItem {
     UA_NodeId monitoredNodeId; 
     UA_UInt32 attributeID;
     UA_UInt32 clientHandle;
-    UA_UInt32 samplingInterval;
+    UA_UInt32 samplingInterval; // [ms]
     UA_UInt32_BoundedValue queueSize;
     UA_Boolean discardOldest;
     UA_DateTime lastSampled;
@@ -77,7 +77,7 @@ typedef struct UA_Subscription {
     LIST_ENTRY(UA_Subscription) listEntry;
     UA_UInt32_BoundedValue lifeTime;
     UA_Int32_BoundedValue keepAliveCount;
-    UA_DateTime publishingInterval;
+    UA_DateTime publishingInterval;     // [ms] may be UA_Int32
     UA_DateTime lastPublished;
     UA_Int32 subscriptionID;
     UA_Int32 notificationsPerPublish;
@@ -97,7 +97,7 @@ void Subscription_updateNotifications(UA_Subscription *subscription);
 UA_UInt32 Subscription_queuedNotifications(UA_Subscription *subscription);
 UA_UInt32 *Subscription_getAvailableSequenceNumbers(UA_Subscription *sub);
 void Subscription_copyTopNotificationMessage(UA_NotificationMessage *dst, UA_Subscription *sub);
-UA_UInt32 Subscription_deleteUnpublishedNotification(UA_UInt32 seqNo, UA_Subscription *sub);
+UA_UInt32 Subscription_deleteUnpublishedNotification(UA_UInt32 seqNo, UA_Boolean bDeleteAll, UA_Subscription *sub);
 void Subscription_generateKeepAlive(UA_Subscription *subscription);
 UA_StatusCode Subscription_createdUpdateJob(UA_Server *server, UA_Guid jobId, UA_Subscription *sub);
 UA_StatusCode Subscription_registerUpdateJob(UA_Server *server, UA_Subscription *sub);

+ 20 - 0
tools/.deployGH_doc.sh

@@ -0,0 +1,20 @@
+#!/bin/bash
+
+#
+# This script is run by travis-ci and pushes generated
+# Doxygen docs and single-source distributions to open62541-www
+#
+
+git clone --depth=5 -b gh-pages https://$GITAUTH@github.com/acplt/open62541-www
+cd open62541-www
+#handle doc
+git rm -r -f doc
+cp -r ../doc ./
+git add -A doc/*
+git config --global user.email "open62541-travis-ci@users.noreply.github.com"
+git config --global user.name "Open62541 travis-ci"
+git config --global push.default simple
+git commit -am "gh-pages updated by travis-ci"
+git push https://$GITAUTH@github.com/acplt/open62541-www
+cd ..
+rm -rf open62541-www

+ 0 - 5
tools/.deployGH.sh

@@ -12,7 +12,6 @@ BRANCH="$(git log --pretty=format:"%d" --date=iso --abbrev=10 --all -1)"
 DATE="$(git log --pretty=format:"%ad" --date=iso --abbrev=10 --all -1)"
 COMMENT="$(git log --pretty=format:"%s" --date=iso --abbrev=10 --all -1)"
 
-git fetch origin coverity_scan
 git clone --depth=5 -b gh-pages https://$GITAUTH@github.com/acplt/open62541-www
 cd open62541-www
 #hanndle releases
@@ -46,10 +45,6 @@ head "-$TAGSTOSAVE" raw.txt > temp && mv temp raw.txt
 fi
 cd ..
 
-#handle doc
-git rm -r -f doc
-cp -r ../doc ./
-git add -A doc/*
 git config --global user.email "open62541-travis-ci@users.noreply.github.com"
 git config --global user.name "Open62541 travis-ci"
 git config --global push.default simple

+ 3 - 2
tools/amalgamate.py

@@ -24,7 +24,7 @@ includes = []
 print ("Starting amalgamating file "+ args.outfile)
 
 file = io.open(args.outfile, 'w')
-file.write(u'''/* THIS IS A SINGLE-FILE DISTRIBUTION CONCATENATED FROM THE OPEN62541 SOURCES 
+file.write(u"""/* THIS IS A SINGLE-FILE DISTRIBUTION CONCATENATED FROM THE OPEN62541 SOURCES 
  * visit http://open62541.org/ for information about this software
  * Git-Revision: %s
  */
@@ -42,7 +42,8 @@ file.write(u'''/* THIS IS A SINGLE-FILE DISTRIBUTION CONCATENATED FROM THE OPEN6
  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  * details.
- */\n\n''' % args.version)
+ */\n\n
+ """ % args.version)
 
 if not is_c:
     file.write(u'''#ifndef %s

+ 18 - 9
tools/generate_datatypes.py

@@ -39,9 +39,9 @@ minimal_types = ["InvalidType", "Node", "NodeClass", "ReferenceNode", "Applicati
                  "SecurityTokenRequestType", "MessageSecurityMode", "CloseSessionResponse", "CloseSessionRquest",
                  "ActivateSessionRequest", "ActivateSessionResponse", "SignatureData", "SignedSoftwareCertificate",
                  "CreateSessionResponse", "CreateSessionRequest", "EndpointDescription", "UserTokenPolicy", "UserTokenType",
-                 "GetEndpointsRequest", "GetEndpointsResponse", "PublishRequest", "PublishResponse", "FindServersRequest", "FindServersResponse",
-                 "SetPublishingModeResponse", "SubscriptionAcknowledgement", "NotificationMessage", "ExtensionObject",
-                 "Structure", "ReadRequest", "ReadResponse", "ReadValueId", "TimestampsToReturn", "WriteRequest",
+                 "GetEndpointsRequest", "GetEndpointsResponse", "PublishRequest", "PublishResponse", "FindServersRequest",
+                 "FindServersResponse", "SetPublishingModeResponse", "SubscriptionAcknowledgement", "NotificationMessage",
+                 "ExtensionObject", "Structure", "ReadRequest", "ReadResponse", "ReadValueId", "TimestampsToReturn", "WriteRequest",
                  "WriteResponse", "WriteValue", "SetPublishingModeRequest", "CreateMonitoredItemsResponse",
                  "MonitoredItemCreateResult", "CreateMonitoredItemsRequest", "MonitoredItemCreateRequest",
                  "MonitoringMode", "MonitoringParameters", "TranslateBrowsePathsToNodeIdsRequest",
@@ -117,30 +117,34 @@ class BuiltinType(object):
             typeid = "{.namespaceIndex = %s, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = %s}, " % \
                      (description.namespaceid, description.nodeid)
         if self.name in ["UA_String", "UA_ByteString", "UA_XmlElement"]:
-            return "{.typeId = " + typeid + \
+            return (("{.typeName = \"" + self.name[3:] + "\", ") if typeintrospection else "{") + ".typeId = " + typeid + \
                 ".memSize = sizeof(" + self.name + "), " + \
                 ".namespaceZero = UA_TRUE, .fixedSize = UA_FALSE, .zeroCopyable = UA_FALSE, " + \
                 ".membersSize = 1,\n\t.members = {{.memberTypeIndex = UA_TYPES_BYTE, .namespaceZero = UA_TRUE, " + \
+                (".memberName = (char*)0, " if typeintrospection else "") + \
                 ".padding = offsetof(UA_String, data) - sizeof(UA_Int32), .isArray = UA_TRUE }}, " + \
                 ".typeIndex = %s }" % (outname.upper() + "_" + self.name[3:].upper())
 
         if self.name == "UA_QualifiedName":
-            return "{.typeId = " + typeid + \
+            return (("{.typeName = \"" + self.name[3:] + "\", ") if typeintrospection else "{") + ".typeId = " + typeid + \
                 ".memSize = sizeof(UA_QualifiedName), " + \
                 ".namespaceZero = UA_TRUE, .fixedSize = UA_FALSE, .zeroCopyable = UA_FALSE, " + \
                 ".membersSize = 2, .members = {" + \
                 "\n\t{.memberTypeIndex = UA_TYPES_UINT16, .namespaceZero = UA_TRUE, " + \
+                (".memberName = (char*)0, " if typeintrospection else "") + \
                 ".padding = 0, .isArray = UA_FALSE }," + \
                 "\n\t{.memberTypeIndex = UA_TYPES_STRING, .namespaceZero = UA_TRUE, " + \
+                (".memberName = (char*)0, " if typeintrospection else "") + \
                 ".padding = offsetof(UA_QualifiedName, name) - sizeof(UA_UInt16), .isArray = UA_FALSE }},\n" + \
                 ".typeIndex = UA_TYPES_QUALIFIEDNAME }"
                 
-        return "{.typeId = " + typeid + \
+        return (("{.typeName = \"" + self.name[3:] + "\", ") if typeintrospection else "{") + ".typeId = " + typeid + \
             ".memSize = sizeof(" + self.name + "), " + \
             ".namespaceZero = UA_TRUE, " + \
             ".fixedSize = " + ("UA_TRUE" if self.fixed_size() else "UA_FALSE") + \
             ", .zeroCopyable = " + ("UA_TRUE" if self.zero_copy() else "UA_FALSE") + \
             ", .membersSize = 1,\n\t.members = {{.memberTypeIndex = UA_TYPES_" + self.name[3:].upper() + "," + \
+            (".memberName = (char*)0, " if typeintrospection else "") + \
             ".namespaceZero = UA_TRUE, .padding = 0, .isArray = UA_FALSE }}, " + \
             ".typeIndex = %s }" % (outname.upper() + "_" + self.name[3:].upper())
 
@@ -176,11 +180,12 @@ class EnumerationType(object):
             typeid = "{.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = 0}, "
         else:
             typeid = "{.namespaceIndex = %s, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = %s}, " % (description.namespaceid, description.nodeid)
-        return "{.typeId = " + typeid + \
+        return (("{.typeName = \"" + self.name[3:] + "\", ") if typeintrospection else "{") + ".typeId = " + typeid + \
             ".memSize = sizeof(" + self.name + "), " +\
             ".namespaceZero = UA_TRUE, " + \
             ".fixedSize = UA_TRUE, .zeroCopyable = UA_TRUE, " + \
             ".membersSize = 1,\n\t.members = {{.memberTypeIndex = UA_TYPES_INT32," + \
+            (".memberName = (char*)0, " if typeintrospection else "") + \
             ".namespaceZero = UA_TRUE, .padding = 0, .isArray = UA_FALSE }}, .typeIndex = UA_TYPES_INT32 }"
 
     def functions_c(self, typeTableName):
@@ -213,9 +218,10 @@ class OpaqueType(object):
             typeid = "{.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = 0}, "
         else:
             typeid = "{.namespaceIndex = %s, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = %s}, " % (description.namespaceid, description.nodeid)
-        return "{.typeId = " + typeid + \
+        return (("{.typeName = \"" + self.name[3:] + "\", ") if typeintrospection else "{") + ".typeId = " + typeid + \
             ".memSize = sizeof(" + self.name + "), .fixedSize = UA_FALSE, .zeroCopyable = UA_FALSE, " + \
             ".namespaceZero = UA_TRUE, .membersSize = 1,\n\t.members = {{.memberTypeIndex = UA_TYPES_BYTESTRING," + \
+            (".memberName = (char*)0, " if typeintrospection else "") + \
             ".namespaceZero = UA_TRUE, .padding = 0, .isArray = UA_FALSE }}, .typeIndex = UA_TYPES_BYTESTRING }"
 
     def functions_c(self, typeTableName):
@@ -283,7 +289,7 @@ class StructType(object):
             typeid = "{.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = 0}, "
         else:
             typeid = "{.namespaceIndex = %s, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = %s}, " % (description.namespaceid, description.nodeid)
-        layout = "{.typeId = "+ typeid + \
+        layout = (("{.typeName = \"" + self.name[3:] + "\", ") if typeintrospection else "{") + ".typeId = " + typeid + \
                  ".memSize = sizeof(" + self.name + "), "+ \
                  ".namespaceZero = " + ("UA_TRUE" if namespace_0 else "UA_FALSE") + \
                  ", .fixedSize = " + ("UA_TRUE" if self.fixed_size() else "UA_FALSE") + \
@@ -295,6 +301,7 @@ class StructType(object):
             layout += "\n\t.members={"
             for index, member in enumerate(self.members.values()):
                 layout += "\n\t{" + \
+                          ((".memberName = \"" + member.name[0].upper() + member.name[1:] + "\", ") if typeintrospection else "") + \
                           ".memberTypeIndex = " + ("UA_TYPES_" + member.memberType.name[3:].upper() if args.namespace_id == 0 or member.memberType.name in existing_types else \
                                                    outname.upper() + "_" + member.memberType.name[3:].upper()) + ", " + \
                           ".namespaceZero = "+ \
@@ -452,6 +459,7 @@ parser = argparse.ArgumentParser()
 parser.add_argument('--ns0-types-xml', nargs=1, help='xml-definition of the ns0 types that are assumed to already exist')
 parser.add_argument('--enable-subscription-types', nargs=1, help='Generate datatypes necessary for Montoring and Subscriptions.')
 parser.add_argument('--typedescriptions', nargs=1, help='csv file with type descriptions')
+parser.add_argument('--typeintrospection', help='add the type and member names to the idatatype structures', action='store_true')
 parser.add_argument('namespace_id', type=int, help='the id of the target namespace')
 parser.add_argument('types_xml', help='path/to/Opc.Ua.Types.bsd')
 parser.add_argument('outfile', help='output file w/o extension')
@@ -459,6 +467,7 @@ parser.add_argument('outfile', help='output file w/o extension')
 args = parser.parse_args()
 outname = args.outfile.split("/")[-1] 
 inname = args.types_xml.split("/")[-1]
+typeintrospection = args.typeintrospection
 existing_types = OrderedDict()
 if args.enable_subscription_types:
     minimal_types = minimal_types + subscription_types

+ 6 - 6
tools/pyUANamespace/README.md

@@ -11,7 +11,7 @@ The pyUANamespace implementation has been contributed by a research project of t
 
 ## Functionality in open62541
 
-In open62541, the linked python namespace generated by the pyUANamespace classes are used to print C-Code that will automatically initialize a server. Apart from parsing XML, most classes also have a printOpen6251Header() or printOpen6251Header_Subtype() function that can reprint the node as C Code compatible with the project.
+In open62541, the linked python namespace generated by the pyUANamespace classes are used to print C-Code that will automatically initialize a server. Apart from parsing XML, most classes also have a printOpen62541Header() or printOpen62541Header_Subtype() function that can reprint the node as C Code compatible with the project.
 
 This function has been wrapped into the generate_open62541CCode.py program, which implements the compiler and option checking relevant to this task. The program is called as follows:
 
@@ -60,7 +60,7 @@ Given the blacklist example, the nodes `ns=1;id=2323` and `ns=0;id=11122` will n
 
 # Supressing attributes
 
-Most of OPC UA Namespaces depend heavily on strings. These can bloat up memory usage in applications where memory is a critical ressource. The compiler can be instructed to suppress allocation for certain attributes, which will be initialized to sensible defaults or NULL pointers where applicable.
+Most of OPC UA Namespaces depend heavily on strings. These can bloat up memory usage in applications where memory is a critical resource. The compiler can be instructed to suppress allocation for certain attributes, which will be initialized to sensible defaults or NULL pointers where applicable.
 
 ```bash
 $ python generate_open62541CCode.py -s browsename -s displayname -s nodeid /path/to/NodeSet.xml /path/to/outputfile.c
@@ -92,7 +92,7 @@ Compiling a namespace consists of the following steps:
 - Parse/Allocate variable values according to their dataType definitions
 
 
-Reading and parsing XML files is handled by ua_namespace.parseXML(/path/to/file.xml). It is the first part of a multipass compiler that will create all nodes contained in the XML description. 
+Reading and parsing XML files is handled by ua_namespace.parseXML(/path/to/file.xml). It is the first part of a multipass compiler that will create all nodes contained in the XML description.
 
 During the reading of XML files, nodes will attempt to parse any attributes they own, but not refer to any other nodes. References will be kept as XML descriptions. Any number of XML files can be read in this phase. __NOTE__: In the open62541 (this) implementation, duplicate nodes (same NodeId) are allowed. The last definition encountered will be kept. This allows overwriting specific nodes of a much larger XML file to with implementation specific nodes.
 
@@ -100,7 +100,7 @@ The next phase of the compilation is to link all references. The phase is called
 
 During the sanitation phase called by ua_namespace.sanitize(), nodes check themselves for invalid attributes. Most notably any references that could not be resolved to a node will be removed from the nodes.
 
-When calling ua_namespace.buildEncodingRules(), dataType nodes are examined to determine if and how the can be encoded as a serialization of OPC UA builtin types as well as their aliases. 
+When calling ua_namespace.buildEncodingRules(), dataType nodes are examined to determine if and how the can be encoded as a serialization of OPC UA builtin types as well as their aliases.
 
 The following fragment of a variable value can illustrate the necessity for determining encoding rules:
 ```xml
@@ -123,7 +123,7 @@ LastMethodOutputArguments : Argument -> i=296
 
 DataTypes that cannot be encoded as a definite serial object (e.g. by having a member of NumericType, but not a specific one), will have their isEncodable() attribute disabled. All dataTypes that complete this node can be used to effectively determine the size and serialization properties of any variables.
 
-Having encoding rules means that data can now be parsed when a <Value> tag is encountered in a description. Calling ua_namespace.allocateVariables() will do just that for any variable node that hols XML Values. 
+Having encoding rules means that data can now be parsed when a <Value> tag is encountered in a description. Calling ua_namespace.allocateVariables() will do just that for any variable node that holds XML Values.
 
 The result of this compilation is a completely linked and instantiated OPC UA namespace.
 
@@ -137,7 +137,7 @@ class testing:
     self.namespace.parseXML("Opc.Ua.NodeSet2.xml")
     self.namespace.parseXML("DeviceNodesSet.xml")
     self.namespace.parseXML("MyNodesSet.xml")
-    
+
     log(self, "Phase 2: Linking address space references and datatypes")
     self.namespace.linkOpenPointers()
     self.namespace.sanitize()